spring-aop认识
基础前瞻
两种动态代理对比:
1.JDK 动态代理:基于接口,只能为接口创建实现动态代理,通过调用目标类实现。
2.CGLib动态代理:基于字节码,创建子类的形式,拦截所有父类的调用。
对比来看:频繁创建类的场景,CGLib效率要比JDK低,而从执行效率的角度,CGlib要比JDK高。
Spring使用原生的动态代理机制虽然可以实现AOP,但是依然有不足的地方:
(1)范围太大,不灵活--目标类所有方法都被动态代理:
(2)织入点扩展不方便—依赖硬编码的形式编写植入点代码
(3)手动创建代理类,代码重复率高,不通用。
Spring的改进:
(1)Pointcut指定织入横切范围
(2)Advice(增强),描述横切逻辑和织入点(方法前 方法后 方法两端)
(3)Avisor(切面)组织 切点 和 增强
Spring扩展增强接口
(1)MethodBeforeAdvice:前置增强 @Before
(2)AfterReturningAdvice:后置增强 @AfterReturning
(3)MethodInterceptor:环绕增强 @Around
(4)ThrowsAdvice:异常增强,适用于事务管理—标签接口 @AfterThrowing
(5)引介增强:类级别的 @DeclareParent
(6)@After 一般用于释放资源
在Spring 的AOP中,如果一个Proxy同时实现MethodBeforeAdvice、AfterReturningAdvice和MethodInterceptor接口,那么这三个Advice的执行顺序是什么样的呢?
经过试验,是和xml文件中的定义顺序有关的。
如果Proxy的接口实现定义为 MethodBeforeAdvice、AfterReturningAdvice、MethodInterceptor
那么执行的结果是
MethodBeforeAdvice
MethodInterceptor: before call
Really method excuting
MethodInterceptor: after call
AfterReturningAdvice
Spring 切面:
(1)静态切面
image.png image.png(2)动态切面
image.pngSpring自动创建代理
(1)基于Bean配置名规则创建器:BeanNameAutoProxyCreator
image.png(2)基于Advisor匹配机制的创建器:DefaultAdvisorAutoProxyCreator
image.png(3)基于Bean的AspectJ注解标签的创建器:AnnotionAwareAspectJAutoProxyCreator
AspectJ是采用注解的形式描述切点、增强
spring配置
image.pngSchema 配置
image.pngAOP无法增强的案例问题:
(1)内部方法之间的调用无法被增强:
访问连接点信息
image.png image.png