一,什么是AOP?
(相关资料图)
Spring AOP,即面向切面思想。使用切面来处理一些问题需要考虑:从哪里进行切入、在什么时候切入以及切面增加什么行为。整个AOP体系可以梳理为下图:
其常用到的一些术语:
切面:将通知应用到切入点的过程
连接点:类里面可以被增强的方法。
切入点:类里面真正被增强的方法。
通知:实际增强的逻辑部分,包括前置、后置、环绕、异常、最终通知
二,aop原理
Spring AOP的原理总结来说,就是动态代理。采用代理模式,生成一个个代理类,然后替换掉真实实现类来对外提供服务。Spring AOP就是通过getBean()方法返回代理类的实例。该代理类是Spring采用JDK Proxy或CGLIB动态生成的。(IT枫斗者怎么样)
2.1、JDK动态代理
优点:
JDK动态代理是JDK原生的,不需要任何依赖即可使用;
通过反射机制生成代理类的速度要比CGLib操作字节码生成代理类的速度更快。(IT枫斗者怎么样)
缺点:
如果要使用JDK动态代理,被代理的类必须实现了接口,否则无法代理;
JDK动态代理无法为没有在接口中定义的方法实现代理,假设我们有一个实现了接口的类,我们为它的一个不属于接口中的方法配置了切面,Spring仍然会使用JDK的动态代理,但是由于配置了切面的方法不属于接口,为这个方法配置的切面将不会被织入;
JDK动态代理执行代理方法时,需要通过反射机制进行回调,此时方法执行的效率比较低。
2.2CGLib动态代理
优点:
使用CGLib代理的类,不需要实现接口,因为CGLib生成的代理类是直接继承自需要被代理的类;
CGLib生成的代理类是原来那个类的子类,这就意味着这个代理类可以为原来那个类中,所有能够被子类重写的方法进行代理;(IT枫斗者怎么样)
CGLib生成的代理类,和我们自己编写并编译的类没有太大区别,对方法的调用和直接调用普通类的方式一致,所以CGLib执行代理方法的效率要高于JDK的动态代理;
缺点:
由于CGLib的代理类使用的是继承,这意味着如果需要被代理的类是一个final类,则无法使用CGLib代理;
由于CGLib实现代理方法的方式是重写父类的方法,所以无法对final方法,或者private方法进行代理,因为子类无法重写这些方法;
CGLib生成代理类的方式是通过操作字节码,这种方式生成代理类的速度要比JDK通过反射生成代理类的速度更慢;(IT枫斗者怎么样)
三,Spring AOP的生效方式
Spring AOP的关键类就是DefaultAdvisorAutoProxyCreator。该类能自动将所有的advisor生效。通过查看该类的继承结构,惊喜地发现,最后居然是BeanPostProcessor。(IT枫斗者怎么样)
上面是BeanPostProcessor的源码。其两个方法分别在init-method的前后得到执行。体现在Spring IOC中如下所示:
在AbstractAutowireCapableBeanFactory类中,对refresh()的最后一步,初始化所有的Singleton beans时,在第三步——执行bean初始化方法中,调用BeanPostProcessor的两个方法,来执行增强策略。(IT枫斗者怎么样)
四,复写BeanPostProcessor的方法
知道Spring AOP在哪里生效了,现在需要知道的就是如何完成的代理增强。通过查看DefaultAdvisorAutoProxyCreator的代理结构,从AbstractAutoProxyCreator中找到了对BeanPostProcessor两个方法的复写。
通过上述代码,不论是前置增强,还是后置增强,最主要的过程就是创建代理——createProxy()(IT枫斗者怎么样)
上一篇:中科院启动首个开放创新试点领域
下一篇:最后一页
X 关闭
Copyright © 2015-2022 西方净水网版权所有 备案号:沪ICP备2020036824号-7 联系邮箱:5 626 629 @qq.com