AOP
AOP即是面向切面编程,目的在于将通用的功能模块在各个类中使用的同时,在各个类中不用显示地调用,让他们能专注于自己的核心代码,起到了
通用功能模块与其他各个模块的解耦合的作用。
描述切面的常用术语有
- 通知(advice)
- 切点(pointcut)
- 连接点(join point)
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只支持方法级别的连接点