Sping源码解析
2022-09-27 21:50:36 0 举报
spring流程图
作者其他创作
大纲/内容
@Aspect@Before@After
三级缓存
createBean
applyBeanPostProcessorsBeforeInstantiation第一次调用bean的后置处理器
TransactionManagementConfigurationSelector基于importSelector
拿到之前所有解析到的advisor
AnnotationAwareAspectJAutoProxyCreator
refresh
根据优先级实现后置处理器priotityOrderedOrdered没有实现任何Order接口的beanFactoryPostProcess
BeanDefinationbean定义
匹配到了,则会创建动态代理createProxy
applicationContextListener事件监听器原理解析
调用findCandidateAdvisor拿到所有实习advisor接口的bean定义
初始化initMethoddistory
在这里注册了beanPostProcessor
解析Advisor
getAdvicesAndAdvisorsForBean拿到所有的advisor
我们AOP @EnableAspectJAutoProxy 为我们容器中导入了 AnnotationAwareAspectJAutoProxyCreator是实现了我们的 BeanPostProcessor接口
prepareBeanFactory
通过priotityOrdered读取到创世纪configurationClassPostProcessor
register
BeanDefinitionReader读取到我们的配置类
类xml@注解
ApplicationListener.onApplicationEvent
finishBeanFactoryInitialization
shouldKip
createBean这里生成动态代理
this
判断bean是不是切面类(有无@Aspect注解)
开启事务
loadBeanDefinitions除了@Component其他注解都是在这里注册成bean定义
这里直接注册了一个内置的advisor
registerListener把我们的事件监听器的名字!!!!注册到多播器上applicationListenerBeans
添加图纸
修改bean定义,需要继承这个类
在创世纪的bean定义中注册了两个关系解析@EventListner的类
注解AOP实现原理
循环当前beanmatch 进行匹配
如果是,会拿到所有的advisor
然后继续调用buildAspectAdvisor拿到所有bean定义
如果是,调用AnnotationAwareAspectJAutoProxyCreator的PostProcessorsBeforeInstantiation方法初始化我们的bean后置处理器
BeanPostProcessor
拿到所有的beanPostProcessor判断是不是实现AnnotationAwareAspectJAutoProxyCreator接口
每一个注解生存对应的advisoradvisor里面对应 advice ponitCut
拿到每一个pointCut
BeanFactoryTransactionAttributeSourceAdvisor
advisor advice pointCut
导入处理事务的bean后置处理器InfrastructureAdvisorAutoProxyCreator
被覆盖
AnnotationTransactionAttributeSource根据当前bean的所有方法进行匹配查看方法--父类方法--接口上的方法看看是否由@transactional注解方法没有找到,就会去找类子类--父类--接口上 看看有无@transactional注解
在doCreateBean中
调用EventListenerMethodPostProcessor.afterSingletonInstantiated处理@EventListner
transactionInterceptor相当于adviseTransactionAttributeSource 专门解析@Transaction注解
List advisor缓存中
postProcessBeanDefinationRegistry
如果设置ProxyTargetClass则会勇CGLIB动态代理否则JDK动态代理
就是把before,after这些放到责任链中
getBean(“key”)
aop是通过@before等来增强代码,这些都是我们自己编写的事务不一样,它都是spring自己内置的实现的
registryBeanPostProcessors会把AnnotationAwareAspectJAutoProxyCreator注册到bean的后置处理器当中
AnnotationConfigApplicationContext
这里思考一个问题,为什么我们在registerListener里面注册了一次监听器,还要在prepareBeanFactory答案:防止懒加载的bean,因为懒加载的bean一开始不会被放入bean定义中,我们的prepareBeanFactory没办法扫描到他
if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config))
ApplicationListenerMethodAdapter.onApplicationEvent反射调用
还注册了很多其他用于解析注解的Bean定义
接口
reader.register(annotatedClasses)
List
shouldSkip拿到所有Bean定义判断是不是@Aspect每个通知都会生成advisor
beanFactoryPostProcessspring集成其他的框架主要靠他
ProxyTransactionManagementConfiguration
invokeBeanFactoryPostProcessors(beanFactory);这个方法会把AnnotationAwareAspectJAutoProxyCreator注册到Bean定义当中去
IOC 实例
AutoProxyRegistrarspan style=\"font-size: inherit;\
@EventListener注解的解析过程
配置类
以@ComponentScan为例BeanDefiniationScan会开始扫描
调用
实例化反射
beanDefinitionRegistry注册成Bean定义
invoke
先调用afterThrowingafterReturingafterbefore
postProcessorBeforeInlatation
BeanFactoryRegistryPostProcess注册bean定义
invokeBeanFactoryPostProcessors(beanFactory);
在我们的第一个bean后置处理器beanPostProcessor就会解析这些注解拿到所有的bean定义,一个一个判断
但是我们没有任何bean定义实现了这个advisor接口,只有早期的接口实现AOP才会有
Aware
初始化之后的bean后置处理器调用我们bean的后置处理器的PostProcessorsAfterInitialization方法创建动态代理
@import--ImportBeanDefinitionRegistrar
判断是否符合生产标准是不是抽象的&& 不是单例的 &&不是懒加载的接着判断是不是FactoryBean 如果是 拿到Bean中getObject里面接着Bean从一级缓存拿,没有的话createBean()
import
结果
processConfigBeanDefinitions
这里findCandidateAdvisor目的是为了向下兼容spring,但是我不懂
getBean
但是在我们开启事务的同时也会开启处理AOP的后置处理器,两个处理器都是xxx处理AOP的处理器会覆盖处理事务的处理器
BeanFactoty
configurationClassParse来开始解析配置类
BeanFactoryPostProcess修改bean定义
填充属性@autowired@value
publishEvent
在初始化后的beanprocessProcessor中调用ApplicationListenerDector将监听器添加到多播器重
beanDefinationMap
initApplicationEventMulticaster();创建我们的事件多播器
拿到匹配到的advisor放到proxyFactroy
@EnableTransactionManagement开启事务
注解
开始依次解析注解@propertySource@ComponentScan@import@importScource@Bean
责任链调用
此处拿到的是null
configurationClassPostProcessor解析我们的配置类例如@Component@import
new了一个BeanDefinitionReader---》里面注册了很多创世纪的类,如configurationClassPostProcessor
将我们的配置类注册到beanDefinitioMap,例如configurationClassPostProcessor
onApplicationEvent直接调用
invokeBeanFactoryPostProcessors(beanFactory);这个方法是拿到所有实现了BeanDefinitionRegistryPostProcess这个接口的类,但是第一次调用时候只有configurationClassPostProcessor这个类实现了这个接口
0 条评论
回复 删除
下一页