SpringBoot AOP

AOP是什么

AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。

利用AOP可对业务逻辑进行增强,在不改变原有逻辑的基础上,在其前后进行处理。降低了耦合性,减少了大量冗余的操作。特别适合用于大量方法都需要进行相同处理的操作。

AOP相关概念

![AOP](../images/SpringBoot AOP/32938e240b174d589359defc6a4828cf.png)

  • 切入点(Pointcut):被增强的方法。
  • 通知、增强方法(Advice):对目标方法的增强,有五种增强类型。
    • 环绕通知(@Around):内部执行方法,在方法执行的前后操作。
    • 前置通知(@Before):再发执行前执行。
    • 后置通知(@After):方法执行后执行。
    • 返回通知(@AfterReturning):方法返回之后执行。
    • 异常通知(@AfterThrowing):方法抛出异常后执行。
  • 切面(Aspect):切入点+通知(增强方法),一般是指被@Aspect修饰的类,代表着某一具体功能的AOP逻辑。

切入点的匹配方法:

表达式类型 功能
execution() 匹配方法,最全的一个
args() 匹配入参类型
@args() 匹配入参类型上的注解
@annotation() 匹配方法上的注解
within() 匹配类路径
@within() 匹配类上的注解
this() 匹配类路径,实际上AOP代理的类
target() 匹配类路径,目标类
@target() 匹配类上的注解

AOP原理

AOP的代理使用JDK动态代理和CGLIB代理来实现,默认如果目标对象是接口则使用JDK动态代理,否则使用CGLIB来生成动态代理类。

动态代理:程序在执行过程中使用JDK的反射机制,创建代理对象,并动态的指定要代理目标类。动态代理涉及的三个类:

  • InvocationHandler接口:处理器,负责调用目标方法(被代理类中的方法),并事项增强功能;通过代理类对象执行目标接口中的方法,会把方法的调用分配给调用处理器的事项类,执行实现类中的invoke()方法,我们需要把在该invoke()方法中实现调用目标类的目标方法;

  • Proxy 类:通过 JDK 的 java.lang.reflect.Proxy 类实现动态代理 ,使用其静态方法 newProxyInstance(),依据目标对象(被代理类的对象)、业务接口及调用处理器三者,自动生成一个动态代理对象。

  • Method 类:Method 是实例化的对象,有一个方法叫 invoke(),该方法在反射中就是用来执行反射对象的方法的。