了解Spring AOP

ace*_*es. 9 java aop spring aspectj

我正在使用Spring 3.0框架,仍然是一个新手.任何人都可以用非专业术语解释我的AOP编程是什么?(一个简短的例子肯定会有帮助)

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

MeB*_*Guy 27

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

我们的想法是,您不是在源代码中找到要修改的所有代码点并手动修改它们,而是定义如何在代码库中查找兴趣点的规则,以及您希望对代码执行哪些修饰.他们.这些规则称为方面(的一个AOP).

原型示例是您希望获得有关代码库中各种方法的时序信息.您可以找到所有感兴趣的方法,并在顶部拨打电话

long start = System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

最后呢

long end = System.currentTimeMillis();
System.out.println("Method time is: " + (end - start));
Run Code Online (Sandbox Code Playgroud)

但那是:

  1. 可能是一堆工作
  2. 临时的,你不想破坏你的代码库

您可以改为定义要说明要修改哪些方法的方面,以及要在这些方法的开头和结尾处执行操作的方面.

当应用AOP时,无论是在jar创建时还是在类加载时,都就像你最初编写类一样.

  • 不幸的是,那些开发/推广 AOP 的人似乎倾向于将其视为比常规编程更高层次的抽象,因此以相对高雅的方式呈现材料,充满了新术语和过于复杂的修辞。我环顾四周寻找示例,这个示例是我能找到的最接近“就这样做”的练习。它可能比大多数都更容易理解:http://www.andrewewhite.net/wordpress/2010/03/17/aspectj-annotation-tutorial/ 它绝不是完整的,但可能会让您尝尝。 (3认同)

Xel*_*ian 7

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

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

  1. 什么是方面?

    |---------------------|------------------|------------------|
    |      Aspect         =     Point cut    +  Advice          |
    |---------------------|------------------|------------------|
    |                     | Where the aspect | What code is     |
    |                     |  is applied      |  executed.       |
    |---------------------|------------------|------------------|
    
    Run Code Online (Sandbox Code Playgroud)

    方面 = 切入点 + 建议

  2. 建议方法的类型

    在此处输入图片说明

  3. 方面示例

    @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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)


Coo*_*ans 5

AOP是用于模块化横切特征的图案.因此,如果某个"事物"适用于您的代码中的重要部分,那么您可以使用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>
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

另请看一下这个相关的问题: -

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


Pre*_*raj 5

AOP 通过将横切关注点分离(模块)到方面来实现有凝聚力的开发。简单来说,它只是一个拦截器来拦截一些进程,例如,当一个方法被执行时,Spring AOP可以劫持正在执行的方法,并在方法执行之前或之后添加额外的功能。

例如:日志记录、事务和安全是一些方面。在日志中,我们可能有不同的方面,即时间计算日志、简单的输入和输出消息日志等等。

  • Advise定义了需要应用的内容。
  • Joinpoint是应用建议的地方。
  • Pointcut是不同Jointpoints的组合。
  • AspectPointcuts 上应用一条建议

注意:对于标记为 final 的方法,Spring 不支持 AOP。

在此处输入图片说明

来源


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

来源


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

来源