事务初始化源码
2020-12-30 11:42:00 0 举报
登录查看完整内容
Spring 事务初始化源码
作者其他创作
大纲/内容
注入
1、先去实现类的方法上找2、实现类的方法上没有,就去实现类上去找3、实现类上没有,就去接口中的方法中4、接口中方法没有,就去接口的上找5、还没找到返回null
applyBeanPostProcessorsAfterInitialization
String[] advisorNames = this.cachedAdvisorBeanNames去类级别缓存中查找有没有Advisor类型的组件的名称
N
此处是false
getBean(payServiceImpl)
AopUtils.findAdvisorsThatCanApply
判断候选的组件是否实现了PointcutAdvisor接口
Y返回null
resolveBeforeInstantiation
事务默认的返回false
....
selectImportsTransactionManagementConfigurationSelector
Y
targetSource != null
把方法描述父设置到事务属性中
N不需要代理
加入缓存
Object cached = this.attributeCache.get(cacheKey)
AnnotationTransactionAttributeSource加入了事物注解解析器
AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry)
默认adviceMode=PROXY
获取实现类上的方法
advisorNames==null
registerBeanDefinitions
1、找到候选的增强器
findCandidateAdvisors
findTransactionAttribute
InfrastructureAdvisorAutoProxyCreator
beanFactoryTransactionAttributeSourceAdvisor增强器
TransactionInterceptor
matchesTransactionAttributeSourcePointcut
postProcessAfterInitializationAbstractAutoProxyCreator
ProxyTransactionManagementConfiguration配置类,往容器里导入了三个组件
找事务注解属性对象
直接返回null
BeanFactoryUtils.beanNamesForTypeIncludingAncestors去容器中查询
N返回事务属性对象
此处找到增强器后没有放到缓存中去,而AOP是放入的,作者应该是考虑到事务的查找不耗费性能
MethodMatcher methodMatcher = pc.getMethodMatcher()
Object[] specificInterceptors =getAdvicesAndAdvisorsForBean
txAttr == null
通过在BeanFactoryAware接口出实例化好的切面探测器工具查找切面
调用BeanPostProcessor的after方法
findAdvisorsThatCanApply
proxyFactory.getProxy(getProxyClassLoader())
直接返回bean
cached == NULL_TRANSACTION_ATTRIBUTE
bean的后续处理
找到事物属性对象
判断是不是基础的Bean() 基础bean不需要代理AdvicePointcutAdvisorAopInfrastructureBean
2、从第一步中获取能用的增强器
shouldSkip
advisorRetrievalHelper.findAdvisorBeans()
isInfrastructureClass
循环candidateAdvisors
注册组件
获取实现类class
设计精髓:Spring将大量解析运算耗时的逻辑进行缓存,供下次调用时,直接从缓存中获取
代理的前置判断
((DefaultTransactionAttribute) txAttr).setDescriptor(methodIdentification)
加载第一个类的时候就会取加载把容器中beanFactoryTransactionAttributeSourceAdvisor 找出来放入到缓存中
Y合适的Advisor就加入到集合中返回
循环advisorNames
getTransactionAttributeAbstractFallbackTransactionAttributeSource
AutoProxyRegistrar
TransactionAttributeSource
去缓存中拿
parseTransactionAnnotationSpringTransactionAnnotationParser解析注解上的属性
ClassUtils.getUserClass(targetClass);
@EnableTransactionManagement
specificInterceptors!=null
isEligibleBean(name)判断当前的advisor是不是合适的
BeanFactoryTransactionAttributeSourceAdvisor集合
postProcessBeforeInstantiationAbstractAutoProxyCreator
导入
创建代理对象时,事务的性能比AOP要高,因为事务的增强器是导入的,而AOP的增强器是遍历所有类和方法进行查找切面
cached != null
返回bean
获取beanFactoryTransactionAttributeSourceAdvisor的方法匹配器
@Import({TransactionManagementConfigurationSelector.class})
canApply真正的查找能用的增强器
创建代理工厂proxyFactory
0 条评论
回复 删除
下一页