spring-aop认识

2018-06-22  本文已影响0人  想做安徒生

基础前瞻
两种动态代理对比:

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.png

Spring自动创建代理

(1)基于Bean配置名规则创建器:BeanNameAutoProxyCreator

image.png

(2)基于Advisor匹配机制的创建器:DefaultAdvisorAutoProxyCreator

image.png

(3)基于Bean的AspectJ注解标签的创建器:AnnotionAwareAspectJAutoProxyCreator

AspectJ是采用注解的形式描述切点、增强

spring配置

image.png

Schema 配置

image.png

AOP无法增强的案例问题:

(1)内部方法之间的调用无法被增强:

访问连接点信息

image.png image.png
上一篇下一篇

猜你喜欢

热点阅读