Spring AOP基础
AOP概念
面向切面编程
AOP希望将分散在各个业务逻辑代码中的相同代码通过横向切割的方式抽取到一个独立的模块中,让业务逻辑代码可以专注于业务本身。
但如何将这些独立的逻辑融合到业务逻辑中以完成和原来一样的业务流程,是事情的关键,也是AOP要解决的主要问题。
AOP术语
- 连接点(Joinpoint)
程序执行的某几个特定位置。Spring仅支持方法的连接点,即仅在方法调用前、方法调用后、方法抛出异常及方法调用前后这些程序执行点织入增强。- 方法表示的程序执行点
- 用相对位置来表示方位
- 切点(Pointcut)
在众多连接点中,AOP通过“切点”定位特定的连接点。 - 增强(Advice)
增强是织入目标类连接点上的一段程序代码。增强既包含用于添加到目标连接点上的一段执行逻辑,又包含用于定位连接点的方位信息,所以Spring提供的增强接口都是带方位名的。 - 目标对象(Target)
增强逻辑的织入目标类 -
织入
将增强添加到目标类的具体连接点上的过程。- 编译期织入,要求使用特殊的Java编译期
- 类装载期织入,要求使用特殊的类装载器
- 运行时织入,在运行时,通过动态代理的方式,调用切面代码增强业务功能。在运行期为目标类添加增强生成子类的方式
Spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
代理
一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类- 切面
切面由切点和增强组成,既包括横切逻辑的定义,也包括连接点的定义。Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入切面所指定的连接点中。
动态代理
- 创建一个实现接口InvocationHandler的类,它必须实现invoke方法
- 创建被代理的类以及接口
- 通过Proxy的静态方法
newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
创建一个代理 - 通过代理调用方法
基于@AspectJ
注解定义切面
@AspectJ
:标识一个切面