AOP

AOP即是面向切面编程,目的在于将通用的功能模块在各个类中使用的同时,在各个类中不用显示地调用,让他们能专注于自己的核心代码,起到了
通用功能模块与其他各个模块的解耦合的作用。

AOP1.png

描述切面的常用术语有

  • 通知(advice)
  • 切点(pointcut)
  • 连接点(join point)

AOP2.png

1、通知

切面的工作即是通知,定义了切面是什么以及何时使用。

Spring切面有5种通知:

  • 前置通知:目标方法调用前
  • 后置通知:目标方法调用后
  • 返回通知:目标方法成功执行后
  • 异常通知:目标方法抛出异常后
  • 环绕通知:通知包括了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为(可决定执不执行被环绕的方法)

2、连接点

连接点是在应用执行过程种能够插入切面的一个点

3、切点

如果说通知定义了切面的“什么”和“何时”的话,那么切点就定义了“何处”。切点的定义会匹配通知所要
织入的一个或多个连接点。

4、切面(Aspect)

通知与切点的结合,规定了是什么,做什么,何时做。

5、引入(Introduction)

引入允许我们向现有的类添加新方法或属性。

6、织入(Weaving)

织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被植入到目标对象种。可在目标对象
的生命周期里有多个点可以进行织入:

  • 编译期
  • 类加载器
  • 运行期

Spring AOP

Spring提供了4种类型的AOP支持
* 基于代理的经典Spring AOP
* 纯POJO切面
* @AspectJ注解驱动的切面
* 注入式AspectJ切面(适用于Spring各版本)

前三种都是Spring AOP实现的变体,Spring AOP构建在动态代理基础之上,因此Spring对AOP的支持局限于方法拦截。

如果AOP需求超过了简单的方法调用(如构造器或属性拦截),那么就需要考虑AspectJ来实现切面。

Spring是通过代理类包裹目标对象,在访问目的方法时,拦截调用先执行切面逻辑后再调用目标方法。
Spring只支持方法级别的连接点

KAI Java, Spring