- 首页
>
- 技术代码
>
- java技术
Spring—AOP原理
xmh
•
2021年01月29日 am08:07
•
技术代码,
java技术,
•
阅读 2985
概述
- Aspect Oriented Programming,面向切面编程,通过定义相关的切面,我们可以在程序的纵向执行过程中对方法进行拦截,织入我们自定义的逻辑,极大的解耦了我们的业务代码和功能代码
- 在SpringAOP中,在执行目标方法之前,先将满足拦截要求的所有的增强器(内含对应的通知)获取到,然后生成一个拦截器链(会对不同类型的增强器进行排序),再通过这个拦截器链执行相关的逻辑,拦截器链的执行顺序如下图(图中包含了五种类型的通知Around、Before、After、AfterReturning、AfterThrowing,排序正是按这个顺序排序的):

切面中的增强器(通知)执行顺序
准备条件
- 在工程中引入spring-aop的依赖
- 目标方法,即被增强的方法
- 定义一个切面,在切面中定义切点,以及通知(@Aspect用来表明这个Bean是个切面,@Component用来被自动扫描)

目标方法

切面
测试结果
around before... before... 实际执行的方法testAop afterReturning... after... around after...
原理分析
- Spring通过自动扫描这个切面,为切面中的每个通知实例化一个增强器存放到BeanFactory中
- 在实例化目标方法所在类的实例对象的时候,可以检测到BeanFactory中存在匹配目标方法的增强器,此时会生成该类的代理类,然后实例化该代理类的实例对象(代理对象会持有目标对象的引用),因此最终注入到Controller中的Service实例是代理对象
- 通过Controller调用Service实例的方法时,实际调用的是代理类的同名方法,而该同名方法实际执行的是MethodInterceptor.intercept方法,不太清楚的请查看CILIB动态代理
- 在intercept方法中,(如果缓存中没有则)会获取匹配该方法的增强器(并放入到缓存中),这些增强器已经是排好序的(排序顺序是Around.class, Before.class, After.class, AfterReturning.class, AfterThrowing.class;如果相同,则再按通知方法的名称进行排序)
- 从Around类型增强器开始执行,如图:

切面中的增强器(通知)执行顺序