SpringBoot#aop
Posted luohaonan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot#aop相关的知识,希望对你有一定的参考价值。
AOP原理解析,一切始于@EnableAspectJAutoProxy。【所有原理分析,看给容器添加了什么组件,组件的功能】
1、@EnableAspectJAutoProxy是什么?
@Import(AspectJAutoProxyRegister.clss)给容器中导入AspectJAutoProxyRegister
利用AspectJAutoProxyRegister给容器中添加一些Bean:
internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator
给容器中注册一个叫AnnotationAwareAspectJAutoProxyCreator。
2、AnnotationAwareAspectJAutoProxyCreator功能分析:
AnnotationAwareAspectJAutoProxyCreator
->AspectJAwareAdvisorAutoProxyCreator
->AbstractAdvisorAutoProxyCreator
->AbstractAutoProxyCreator
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
在弄明白继承关系后,需要关注后置处理器(bean初始化前后完成的事情)、自动装配BeanFactory
3、给主要相关逻辑加上断点
AbstractAutoProxyCreator.setBeanFactory() //被子类重写
AbstractAutoProxyCreator.postProcessBeforeInstantiation()
AbstractAdvisorAutoProxyCreator.setBeanFactory() ->> initBeanFactory() //被子类重写
AnnotationAwareAspectJAutoProxyCreator.initBeanFactory()
4、调用流程(30p)
1)传入配置类,创建ioc容器
2)注册配置类,调用refresh()刷新容器
3)registerBeanPostProcessors(beanFactory)//注册用来拦截bean创建的后置处理器:
1)在ioc容器中按BeanPostProcessor.class类型获取已经定义要创建的所有后置处理器的名称
2)给容器中加入别的BeanPostProcesser
3)优先注册实现了PriorityOrdered接口的BeanPostProcessor;
4)再给容器中注册实现了Ordered接口的BeanPostProcesser;
5)注册没有实现优先级接口BeanPostProcessor
6)注册BeanPostProcessor实际上就是创建BeanPostProcessor对象,保存在容器中。
创建internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator
1)创建bean实例
2)populateBean,给bean的各种属性赋值
3)initializeBean,初始化bean
1)invokeAwareMethods():处理Aware接口的方法回调
2)applyBeanPostProcessorsBeforeInitialization()应用后置处理器的postProcessBeforeInitialization方法
3)invokeInitMethods()执行自定义的初始化方法
4)applyBeanPostProcessorsAfterInitialization()执行后置处理器的postProcessAfterInitialization方法;
4)一个BeanPostProcessor的实现就注册成功了(AnnotationAwareAspectJAutoProxyCreator)
7)把BeanPostProcessor注册到BeanFactory中:
beanFactory.addBeanPostProcessor(postProcessor);
=========以上是创建和注册AnnotationAwareAspectJAutoProxyCreator的过程========================
AnnotationAwareAspectJAutoProxyCreator => InstantiationAwareBeanPostProcessor
4)finishBeanFactoryInitialization(beanFactory);完成BeanFactory初始化工作,创建剩下的单实例bean
1)遍历获取容器中所有的Bean依次创建对象getBean(beanName);
getBean->> doGetBean()->>getSingleton()->>
2)创建Bean
【AnnotationAwareAspectJAutoProxyCreator在所有bean创建之前会有一个拦截,会调用postProcessBeforeInstantiation】
1)先从缓存中获取当前bean,如果能获取到,说明bean是之前创建的,直接使用,否则再创建,
只要创建好的Bean都会被缓存起来
2)createBean();创建bean,AnnotationAwareAspectJAutoProxyCreator会在任何bean创建前先尝试返回bean实例。
【BeanPostProcessor是在Bean创建完成初始化前后调用的】
【InstantiationAwareBeanPostProcessor是在创建Bean实例前先尝试使用后置处理器返回对象】
1)resolveBeforeInstantiation(beanName,mbdToUse);解析BeforeInstantiation
希望后置处理器在此能返回一个代理对象,如果能返回就使用,否则就继续
1)后置处理器先尝试返回对象:
bean=applyBeanPostProcessorsBeforeInstantiation();
拿到后置处理器,如果是InstantiationAwareBeanPostProcessor就执行postProcessBeforeInstantiation
if(bean != null){
bean = applyBeanPostProcessorsAfterInitialization(bean,beanName)
}
2)doCreateBean(beanName,mbdToUse,args);真正的去创建一个bean实例,和3.6的流程是一样的。
3)
以上是关于SpringBoot#aop的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot入门到精通-SpringBoot自定义starter
最全面的SpringBoot教程——SpringBoot概述