Spring AOP

AOP  面向切面编程,在软件开发中某些行为对大多数应用是通用的,如性能监视,写日志,事物管理。这些行为嵌在业务逻辑代码中,在很多地方被重复使用。一般把这些行为称为横切关注点。如何把横切关注点从业务代码中分离出来,让业务代码只关注业务本身就是AOP要解决的问题。

aop中的相关概念

连接点(JoinPoint):某个方法的前面或后面,应用程序执行时能在连接点处插入一个切面。如:

切面(aspect):横切关注点被摸块化为类后,这些类被称为切面,通知和切点的结合

通知(Advice):又被称为增强,切面所要完成的工作,一段被织入目标连接点的程序代码。Spring中的五中通知:BeforeAdvice (前置通知),AfterReturningAdvice(后置通知) ,ThrowsAdvice(异常通知) , Around(环绕通知),Introduction(引介通知)

切点(pointcut):通知所要织入的连接点的位置,一般用execution()表达式或正则表达式进行描述。

目标对象(target):增强逻辑的织入目标类。

织入(weaving):将切面应用到目标对象来创建新的代理对象的过程。

代理对象(proxy):一个类被aop织入增强后,所得到的结果类。

引介(introduction):某个类没有实现某个接口,通过引介可以为该类动态的添加该接口的实现逻辑

Spring对AOP的支持 :1.基于代理的AOP     2.@AspectJ注解驱动的切面    3.纯POJO切面   4.注入式AspectJ切面(基于Schema)

Spring aop的底层采用动态代理技术(基于jdk的动态代理和基于CGLib的动态代理)

配置方法

<bean id="playMagic" class="com.aop.PlayMagic"/>   --该bean 为目标对象bean
<bean id="audience" class="com.aop.Audience"/>    --该bean为增强方法所在的bean
<aop:config>
  <aop:aspect ref="audience"> --切面中引用增强
       <aop:before method="takeSeats" pointcut="execution(* com.aop.PlayMagic.play(..))"/>  --配置引用增强中的某个方法和切点表达式,切点表达式为
</aop:aspect> 目标对象的某个方法
</aop:config>

采用AspectJ注解方式

<aop:aspectj-autoproxy/>  --自动代理
<bean id="playMagic" class="com.aop.PlayMagic"/>   --目标对象的bean
<bean  class="com.aop.Audience"/>    --增强类bean 

增强类

package com.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class Audience {
    @Before("execution(* com.aop.PlayMagic.play(..))")
    public void takeSeats(){
        System.out.println("The audience is taking their seats");
    }
}

还有很多配置的细节在用的时候查文档就行

原文地址:https://www.cnblogs.com/coderising/p/5827455.html