理解Spring AOP

13

我正在使用Spring 3.0框架,并且还是一个新手。有人能用通俗易懂的语言解释一下什么是AOP编程吗?(一个简短的例子肯定会有帮助)

Spring如何结合/增强/支持它?


看看Spring的手册,它们真的很棒(真心话!) - Mark Elliot
1
我尝试阅读文章、手册和论坛来理解AOP,但是所有模糊的术语和抽象的语言让我感到困惑(我的小脑袋试图处理这些术语时会崩溃)。 - aces.
1
《Spring实战 第三版》(http://www.manning.com/walls4/)提供了关于Spring中面向切面编程的优秀解释。 - Derek Mahar
我建议您从理论到代码示例跟随这个教程:了解Spring AOP - Nam
请查看此文章:http://marcin-chwedczuk.github.io/overview-of-spring-annotation-driven-aop - csharpfolk
5个回答

31

AOP是一种在代码库中修改现有类以根据单独定义的规则进行装饰或更改其行为的方式。这种修改可以在将类放入jar / war之前完成,也可以在加载代码时动态进行。

这个想法是,而不是在源代码中找到要修改的所有代码点并手动修改它们,您可以为如何查找代码库中感兴趣的点以及要执行的装饰定义规则。这些规则被称为方面(AOPA)。

原型示例是,您想要获取代码库中各种方法的一些计时信息。您可以找到所有感兴趣的方法,并在顶部调用一个方法。

long start = System.currentTimeMillis();

最后执行以下操作:

long end = System.currentTimeMillis();
System.out.println("Method time is: " + (end - start));

但这可能需要大量的工作,而且它是暂时性的,您不希望破坏您的代码库。

  1. 相反,您可以定义方面来说明要修改的方法以及您想在这些方法的开头和结尾执行的操作。

当应用AOP时,无论是在创建jar文件时还是在类加载时,都好像您最初就是以这种方式编写这些类一样。


1
这确实很有帮助。你能提供一些对于像我这样的初学者非常有用且易于理解的链接或文章吗? - aces.
3
不幸的是,那些开发/宣传AOP的人往往认为它是比常规编程更高层次的抽象,因此用一种相对高深的方式呈现材料,充满了新术语和过度复杂的修辞。我寻找了一些示例,这个链接是我能找到的最接近“只需这样做”的练习。它可能比大多数人都容易理解:http://www.andrewewhite.net/wordpress/2010/03/17/aspectj-annotation-tutorial/ 它肯定不完整,但可以让你尝试一下。 - MeBigFatGuy

7

AOP是一种用于模块化横切功能的模式。因此,如果有某个“事物”适用于您代码中的大部分,则可以使用AOP来解决该问题。这些“事物”称为方面。

以下是一个示例:

企业应用程序中使用异常记录器。因此,您可以使用以下方式设置它。现在,my.service包下的所有方法都将以以下方式记录日志。

  <bean id="exceptionLogger" class="my.good.ExceptionLogger" />  
        <aop:config>
                <aop:pointcut id="allServiceMethods" expression="execution(* my.service.*(..))" />
                <aop:aspect id="serviceLogger" ref="exceptionLogger">
                    <aop:after-throwing pointcut-ref="allServiceMethods"
                                        method="logIt"
                                        throwing="e"/>
                </aop:aspect>  
        </aop:config>

ExceptionLogger类可能如下所示:-
public class ExceptionLogger {
    private static Logger logger = Logger.getLogger(ExceptionLogger.class);
    public void logIt(JoinPoint jp, Exception e) {
        StringBuilder msg = new StringBuilder();
        msg.append("<whatever makes sense>");
        logger.error(msg.toString());
    }
}

同时也可以查看相关问题:

  1. Spring项目中AOP的最常见用途是什么?

1
AOP是一种用于模块化横切特性的模式。您能解释一下这个说法吗?什么是横切特性?您能提供任何有用的链接或文章来解释这个问题吗?谢谢。 - aces.
1
日志记录、事务管理和时间跟踪(正如@MeBigFatGuy所提到的)是横切面的好例子。由于它们通常适用于所有方法,因此您可以将它们定义为方面,而不是一遍又一遍地编写相同的样板代码。这样,Spring将自动处理它们,希望这能对您有所帮助! - CoolBeans

7

面向切面编程是一种相对较新的编程方式,它并不是面向对象编程的替代品。事实上,AOP是另一种组织程序结构的方式。

为了更加清晰,我将使用一些图表:

  1. What is Aspect?

    |---------------------|------------------|------------------|
    |      Aspect         =     Point cut    +  Advice          |
    |---------------------|------------------|------------------|
    |                     | Where the aspect | What code is     |
    |                     |  is applied      |  executed.       |
    |---------------------|------------------|------------------|
    

    Aspect = Point cut + Advice

  2. Type of Advice methods

    enter image description here

  3. Aspect Example

    @Around( "execution(* *(..))" )
    public Object trace(ProceedingJoinPointproceedingJP)throwsThrowable{
        String methodInformation= proceedingJP.getStaticPart().getSignature().toString();
        logger.trace("Entering "+methodInformation);
        try{
            returnproceedingJP.proceed();
        } catch(Throwable ex) {
            logger.error("Exception in "+methodInformation, ex);
            throw ex;
        } finally {
             logger.trace("Exiting "+methodInformation);
        }
    }
    

6
AOP使开发更加协同,通过将交叉关注点分离(模块化)到方面中。简单来说,它只是一个拦截器,用于拦截一些进程,例如当执行方法时,Spring AOP可以劫持执行方法,并在方法执行之前或之后添加额外的功能。例如:日志记录、事务和安全性是一些方面。在日志记录中,我们可能有不同的方面,即时间计算日志记录、简单的进出消息日志记录等。建议定义需要应用什么。连接点是应用建议的位置。切入点是不同连接点的组合。方面在切入点处应用建议。 注意:Spring不支持将AOP用于标记为final的方法。

enter image description here

来源


AOP的工作方式类似于面向对象编程。在面向对象编程中,模块化的单位是对象,但在面向切面编程中,模块化的单位是切面切面作为AOP中横切关注点的模块化。AOP框架可以在Spring中插入使用。AOP提供声明式企业服务,并允许用户实现自定义切面。

来源


Spring提供了AOP的声明式编程。这是一种更好的实现横切关注点的方式,而无需在核心业务类中使用“管道代码”。AOP使您能够考虑系统中的关注点或方面。典型的关注点包括事务管理、日志记录等。AOP使您能够在模块(如拦截器)中捕获交叉切割的代码,并在适用它们所表达的关注点的任何地方声明式地应用它们。Spring包括基于代理的AOP框架。 来源

1
简而言之,AOP是数学家解释如何整洁地组织代码的方式,以避免特定功能散布在许多模块或对象的碎片中。从本质上讲,无论是否称为AOP,它都是一件好事。
但是你面临着一个具体的AOP实现,并需要弄清楚如何使用它。我认为最好的方法是寻找博客,在那里人们发布使用Spring的配方和示例。这样,您就可以绕过数学家,阅读更接近现实的工程师的文章。
有两种计算机科学家,一种是喜欢晦涩难懂并使用拗口术语来解释简单事物的数学家,另一种是会逐步告诉您如何构建软件的工程师。工作程序员往往更倾向于工程师思维方式,因为抽象思考者很难处理获得经验的漫长过程。这就是为什么您会发现AOP难以理解。不是因为它难以理解,而是因为抽象的数学思想家用“平常话”解释得很差。
我想知道如果一个AOP大师与一个函数点分析大师坐下来会发生什么。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接