2

你好我已经开始学习spring MVC了。编写代码做得很好,但我仍然觉得 AOP 是一个很难理解的概念,已经检查了这篇文章。并浏览了 Spring 文档。我仍然觉得它令人困惑,因为解释不是外行术语,而且难以理解。AOP 有常见的日志记录示例。还是不明白它的灵魂。您能否用通俗的语言解释带有和不带有示例实现的概念是什么。欢迎提供优秀教程的链接。请不要发表长篇大论,以免这篇文章变得毫无用处。这仅用于解释。现在可以忽略使用它的好处/缺点。

4

1 回答 1

3

我认为就定义而言,查看 Aspecting 的最简单方法是使用单个表达式定义代理(或多个代理)的声明性方式。

人为的情况:

假设您想计算调用“getter”方法的次数,即应用程序中的任何getter 方法。好吧,您可以单独找到每个“getter”方法并增加一些静态计数器。这对您来说可能是可以接受的,但您还需要确保对从那时起添加到您的应用程序的每个“getter”方法执行相同的操作。

考虑一个方面:

方面由两个主要内容组成。代理,即正在执行的代码,以及声明性表达式,它告诉应用代理代码的位置。

可以为“getter”编写代理,在方法调用之前或之后,它会自动递增计数器。这个代理的问题是它仍然需要应用于每个“getter”方法。这是一个方面的亮点。您可以编写一个快速定义(通过您最喜欢的方面库表达式语言)说,“为所有 'getter' 方法做这个代理。

使用 SpringAOP 的示例:

@Aspect
public class MyAspect
{
    private static int counter = 0;

    @Before("execution(* get*())")
    public void incrementCounterProxy()
    {
        counter++;
    }
}

示例说明:

假设您已正确设置 Spring 容器的所有内容以获取方面,这应该可以实现我们的人为目标。

  1. @Aspect将我们的类标记为包含方面的候选类。
  2. @Before标记我们的代理类型。方法中的代码将是一个代理,它只在目标方法调用之前做一些事情。
  3. execution(* get*())是我们的声明式表达式,它将此代理应用于所有以“get”开头且没有参数的方法的执行。
于 2013-05-31T13:59:56.317 回答