spring-AOP
一、AOP术语
1.连接点(joinpoint)
特定点是程序执行的某个特定位置,如类开始初始化前,初始化后,某个方法调用前等,这些具有边界性质的特定点就称为“连接点”
2.切点(pointcut)
每个类拥有多个连接点,AOP是通过“切点”定位到这些连接点,连接点就相当于数据库中的记录,切点相当于查询条件,一个切点可以匹配到多个连接点
3.增强(advice)
advice中既包含添加到目标连接点上的一段执行逻辑,又包含用于定位连接点的方位信息,所以spring中提供的增强接口都是带方位名称的,如BeforeAdvice等,只有结合切点和增强,才能确定特定的连接点并实施增强逻辑
4.目标对象(target)
增强逻辑的织入目标类
5.引介(introduction)
引介是一种特殊的增强,为类添加了一些方法和属性,这样,及时一个类中没有实现某个接口,通过引介也可以动态为该类添加接口的实现逻辑。
6.织入(weaving)
织入是将增强添加到目标类的具体连接点的过程。
AOP有三种织入方式
(1)编译器织入,要求使用特殊的java编译器
(2)类装载期织入,要求使用特殊的类加载器
(3)动态代理织入,在运行期为目标类添加增强生成子类的方式
Spring采用动态代理织入,而AspectJ采用编译期织入和类加载期织入
7.代理(Proxy)
一个类被AOP织入增强后,就产生一个结果类,融合了原类和增强逻辑的代理类
8.切面(Aspect)
切面由切点和增强 (引介)组成,它既包含横切逻辑的定义,也包括连接点的定义。
SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入切面所指定的连接点中。
AOP的重心就是在于如果将增强应用于目标对象的连接点中,这里包括两项工作:
第一:如何通过切点和增强定位到连接点上;
第二:如何在增强中编写切面的代码。
二、动态代理和静态代理
动态代理是运行时动态产生的代理
动态切面和静态切面都是由动态代理实现的
所谓静态切面,是指在生成代理对象时就确定了增强是否需要织入目标类的连接点上,而动态切面是指必须在运行期根据方法入参的值来判断是否需要织入目标类的链接点上
静态切面只执行一次,动态切面每次运行的时候都会执行
在生成织入切面的代理对象后,第一次调用代理类的每一个方法时都会进行一次静态切点检查。
如果本次检查就能把不符合代理匹配规则的方法排除,则以后对该方法的调用就不在执行静态切点检查以及动态切点检查,对于那些匹配的方法,在后续调用该方法时,将执行动态切点检查
三、CGLB代理和JDK代理
JDK动态代理只能为接口创建实例
cglib创建动态代理对象性能比jdk高10倍左右
jdk创建动态代理对象时间比cgLib快8倍左右
所有对于singleton对象或者具有实例池的代理 cglib比较合适
反之jdkb比较合适
JDK代理
主要涉及两个类,Proxy和InvocationHandler,InvocationHandler是个接口,可以实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将业务逻辑和横切逻辑编织在一起。
代码示例如下

内部调用时序图
CGLB代理采用底层字节码技术,可以为一个类创建子类,在子类中采用方法拦截所有父类方法的调用并顺利织入横切逻辑。
代码示例如下


springAOP就是通过使用JDK或者CGLB代理技术给目标Bean织入横切逻辑
springAOP通过(Pointcut)切点指定在哪些类的哪些方法上织入横切逻辑,通过Advice(增强)描述横切逻辑和具体切入点(方法前,方法后等),此外,Spring通过(Advisor)切面将Pointcut和Advice组装起来,就可以采用统一的方式为目标类创建代理对象
四、基于@Aspect注解的AOP
使用@Aspect定义一个切面

各种切面类型总结


浙公网安备 33010602011771号