Spring AOP的理解_世界最资讯

来源:哔哩哔哩 时间:2023-05-08 10:36:58

一,什么是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