且看一个简单事务得全流程分析
2021-11-05 15:51:31 1 举报
且看一个简单事务得全流程分析
作者其他创作
大纲/内容
areaServiceImpl
如果是imported类型
new AnnotationConfigApplicationContext(TeansactionScan.class)
aop入口
MapperFactoryBean
AbstractAutowiredCapableBeanFactory.doCreateBean这是一个factoryBean
是一个factorybean的实现
begain
拿到对应的beandefinitions开始处理
exposedObject
初始化前置和后置方法
执行invokeBeanFactoryPostProcessors,显然这里只有一个ConfigurationPostProcessor收集configuration,并生成一个cglib代理类添加一个ImportAwareBeanPostProcessor ******aware 后置处理器里面添加了3个bean'6. internalEvnetListenerProcessor7. internalEvnetListenerFactory8. internalTransactionalEvnetListenerProcessor
@Value填充
前置处理
initMessageSource()
MapperFactoryBean--解读1.核心方法 getObjectType 和getObject,2. 实现了factoryBean的类创建的时候会去执行核心方法,MapperFactoryBean与mybatis整合1.mybatis 仅仅只有接口,那么生成一个类,必然依赖动态代理,MapperProxy 动态代理类执行器,实现了InvocationHandler,span style=\"font-size: inherit;\
this()
ConfigurationClassPostProcessor
这个类得作用就是收集知道得config类得信息,1.先获取所有得内部类,然后获取内部类中得config得类,然后循环1.2 循环得时候,根据包名,开始扫描,获取指定包名下的所有class,然后开始匹配查找付合条件得class( @Component注解的类)2. 拿到了所有需要注册的beandefinition,开始处理beandefinition
prepareBeanFactory
如果有父类,继续来一波
设置bean的class为MapperFactoryBean
先收集BeanDefinitionRegistryPostProcessor然后根据类型处理优先级,排序,无排序这里会直接调用到getbean,也就是创建实例
处理config中的bean method
然后继续解析,解析当前beandefinition的所有有bean注解的方法并添加到当前config的beanmethods中用于后续处理
refresh()// 核心
构造方法执行
1
里面是一些BeanPostProcessor接口的应用这里关注
1. internalConfigurationAnnotationProcessor 2. internalAutowiredAnnotationProcessor3. internalCommonAnnotationProcessor4. internalEventListenerProcessor5. internalEventListenerFactory
前期准备条件,获取扫描注解,获取初始bean
又是一个后置处理器
如果是importedResources
添加一个messageSource***12个bean
在ConfigurationClassParser继续执行到doProcessConfigurationClass()周而复始去解析,如果是configuration,如果是有Import标签等的
预备条件:spring5.2.8mysqlmybatis
dataSourceConfiguration19
populaBean
收集config类显然,这里只有一个我们定义得testScan
现在是6 + 3 = 9个beandefinition
getBean(commonMapper)这里这个bean是mybatis的需要注意
beanPostProcessors
doScan(package)
见名知意,就是处理config类
teansactionScan
解析config
读取注解,扫描添加
DefaultListableBeanFactory对象
到这里就有了6个beandefinition对象
这个方法得作用是,把当前得bean注册到beandefinition对象中
TeansactionScan$AutoScan这里由于@MapperScan,里面又@Import标签,所以会走到Import解析注册内部类com.ding.demo.spring.transaction.config.TeansactionScan$AutoScan20 -- com.ding.demo.spring.transaction.config.TeansactionScan$AutoScan-----------------由于@Import里面的MapperScannnerRegistrar 是ImportBeanDefinitionRegistrar类型所以会执行到loadBeanDefinitionsFromRegistrars***********************这里会使用mybatis-spring的包了,***加器理解,属于对spring的扩展整合
BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor接口得调用
finishBeanFactoryInitialization(beanFactory)
18 teansactionScan
读取config
ApplicationListenerDetector
processBeanDefinitios(beandefinitios)
TeansactionScanbeanMethod22 -- aa
18个bean了
循环创建bean
属性填充
是否需要生成代理类
目前还是9个,因为beanmathod还没有处理
调用后置处理器方法
ClassPathBeanDefinitionScanner添加能扫描得注解(component)
这里扩展一下mybatis
这个时候有11个bean创建了
通过beanfactody获取类型为BeanPostProcessor的beanName然后提前实例化,便于后续操作这里有三个1. internalAutowiredAnnotationProcessor -- CommonAnnotationBeanPostProcessor2. internalCommonAnnotationProcessor -- AutowiredAnnotationBeanPostProcessor3. internalAutoProxyCreator -- InfrastructureAdvisorAutoProxyCreator然后加入到beanfacroty的beanPostProcessors 中
registerBeanPostProcessors(beanFactory)
beandefinitionMap
initApplicationEventMulticaster()
创建beanwarapper对象
添加一个applicaionEventMulticaster*** 13个bean
register(class)
接下来注册创建所有的bean
设置每个beandefinition
ApplicationContextAwareProcessor
@Autowired填充
loadBeanDefinitionsFromRegistrars
解析到EnableTransactionManagementBean这个beandefinition那么它上面的@EnableTransactionManagement有@Import标签所以会执行到configurationClassParser的processImports()
loadBeanDefinitionsFromImportedResources
bean初始化
ProxyTransactionManagementConfiguration-------Import 10+1beanMethos -->12 -- transactionAdvisor13 -- transactionAttributeSource14 -- transactionInterceptor15 -- 父类 - transactionalEventListenerFactory
AbstractAutowireCapableBeanFactory
加载默认bean
invokeBeanFactoryPostProcessors(beanFactory)
enableTransactionManagementBeanbeanMethods16 -- sqlSessionFactoryBean17 -- annotationDrivenTransactionManager18 -- transactionTemplate--------此外由于@EnableTransactionManagement 的@Import 里面的AutoProxyRegistrar是ImportBeanDefinitionRegistrar类型会进入到loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars()); 所以看AutoProxyResgistar.registerBeanDinitions方法------------会读取enableTransactionManagementBean的注解,这里读取到两个,@EnableT这个付合,执行AopConfigUtils.registerAutoProxyCreato方法(就是开启AOP),***就是向beanDefinition添加注册一个internalAutoProxyCreator19 -- internalAutoProxyCreator
第一次执行完,spring中有五个bean1. ConfiguratilPostProcessor2. systemEnvironment3. ConfiguratilPostProcessor$ImportStack4.environment5.systemProperties
DataSourceConfiguration 9+1(dynamicDataSource)---beanMethod
mybatis
调用beanPostProcessorInfrastructureAdvisorAutoProxyCreator
1. org.springframework.context.annotation.internalConfigurationAnnotationProcessor ******** ConfigutaionClassPostProcessor2. org.springframework.context.event.internalEventListenerFactory3. systemEnvironment4. org.springframework.context.event.internalEventListenerProcessor5. org.springframework.aop.config.internalAutoProxyCreator ******** InfrastructureAdvisorAutoProxxCreator6. org.springframework.context.annotation.internalAutowiredAnnotationProcessor ******** AutowiredAnnotationBeanPostProcessor7. org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry 8. applicationEventMulticaster9. environment10. org.springframework.context.annotation.internalCommonAnnotationProcessor ****** CommonAnnotationbeanPostProcessor11. org.springframework.transaction.config.internalTransactionalEventListenerFactory 12. systemProperties13. messageSource
收藏
收藏
0 条评论
下一页