当前位置:   article > 正文

SpringBoot的AOP原理

SpringBoot的AOP原理

 

前言

  Spring的两大特性为IOCAOP,所以想要彻底的去了解和熟悉Spring或者SpringBoot,那么IOCAOP是首当其冲需要去了解和熟悉他们原理的,不然都不好意思说自己了解SpringBoot,更别说能够用好SpringBoot了。

  SpringBoot是如何去实现AOP的呢?通过几个简单的注解就可以实现方法的增强,其中的原理又是什么呢,这篇文章就来详细的分析一下SpringBoot实现AOP的原理。


一、SpringBoot的扩展点

  SpringBoot实现的几乎所有的功能都是通过SpringBoot提供的各种扩展点来实现的,而实现AOP则是依赖扩展点InstantiationAwareBeanPostProcessor来实现的,关于这个扩展点的具体作用,以及执行的时间可以直接参考这篇文章《

二、SpringBoot的AOP源码分析

1.@EnableAspectJAutoProxy注解

  SpringBoot通过AspectJ来实现动态代理,从而来实现来实现AOP增强。而注解@EnableAspectJAutoProxy正是开启AspectJ动态代理的注解

注解引入了AspectJAutoProxyRegistrar

 

 AspectJAutoProxyRegistrar类中通过BeanDefinitionRegistry注册了AnnotationAwareAspectJAutoProxyCreator,这个类正式实现AOP增强逻辑的关键所在

该类实现了 InstantiationAwareBeanPostProcessor,所以下面分析AOP实现原理的思路就是按照该扩展点执行的时机去看具体的实现逻辑。

2.AspectJAwareAdvisorAutoProxyCreator创建AOP的过程

2.1 postProcessBeforeInstantiation方法执行

  SpringBoot创建Bean的过程想必都已经是有所了解的了,所以直接进入到AbstractAutoWireCapableBeanFactory#createBean方法

这个方法里面会先执行 InstantiationAwareBeanPostProcessor的resolveBeforeInstantiation方法。所以这里看AspectJAwareAdvisorAutoProxyCreatorresolveBeforeInstantiation的方法逻辑。


 可以看到这里执行了AbstractAutoProxyCreator#postProcessBeforeInstantiation方法,方法里面的逻辑为:

  • 判断是否自定义过AOP增强实现的targetSource
  • 判断是否是Advice、Pointcut、Advisor等特殊类,同时将这些类放入advisedBeans
  • 判断是否有自定义TargetSource增强,如果有则通过TargetSource去生成代理对象
  • 没有满足第三条都返回null,根据InstantiationAwareBeanPostProcessor扩展点的特性可知,返回null的话后面会继续执行createBean的操作

2.2 postProcessAfterInitialization方法

在执行initmethod的前后分别执行了BeanPostProcess的前置方法和后置方法,AOP的实现逻辑主要在后置方法中执行。

  进入AbstractAutoProxyCreator的后置方法

其中wrapIfNecessary就是实现AOP的主要逻辑代码

 getAdvicesAdnAdvisorsForBean方法会先查询到所有的切面,并且根据当前的类,找到当前类所匹配的切面,这里直接看结果

这里匹配到了我定义的前置和后置切面方法

 

  getAdvicesAdnAdvisorsForBean方法里面的具体逻辑可以看这篇文章,写的非常详细SpringBoot的AOP原理icon-default.png?t=N7T8http://t.csdnimg.cn/OSYDB 

2.3 生成代理对象

  进入到AbstractAutoProxyCreator#createProxy方法

方法里面先设置了代理类和代理接口-->将切面Advisor放入到ProxyFactory中-->设置需要代理的类-->最后调用ProxyFactory的getProxy方法创建代理对象。

 

这里直接看一下创建并且返回的代理对象

 

代理对象中就包括了所有的切面方法 

总结

  SpringBoot的AOP就是利用SpringBoot提供的扩展点在Spring的Bean的生命周期的过程中去操作和增强Bean。其中使用到的扩展点为InstantAwareBeanPostProcessor

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/131116
推荐阅读
相关标签
  

闽ICP备14008679号