spring注解
@EnableTransactionManagement
@Import(TransactionManagementConfigurationSelector.class)
1、在invokeBeanFactoryPostProcessors阶段加载TransactionManagementConfigurationSelector配置类。
org.springframework.transaction.annotation.TransactionManagementConfigurationSelector#selectImports
2、TransactionManagementConfigurationSelector类来完成AutoProxyRegistrar、ProxyTransactionManagementConfiguration两个类的注入。
2-1、AutoProxyRegistrar
提供了自动代理的功能,这个阶段可以将被代理的Bean注入到BeanDefines中去。
2-2、 ProxyTransactionManagementConfiguration
负责注入
TransactionalEventListenerFactory、TransactionAttributeSource、TransactionInterceptor三个类
通过事件驱动模式来完成事务过程。
2-2-1、TransactionalEventListenerFactory
本质是一个ApplicationListener,registerListeners方法实现注册事件监听。
2-2-2、TransactionAttributeSource
在invokeBeanFactoryPostProcessors自动装配环节,解析@Bean注解,将BeanDefines封装成了TransactionAttribute:propagation、isolation、timeout、readOnly、value、rollbackFor、rollbackForClassNamenoRollbackFor、noRollbackForClassName
2-2-3、TransactionInterceptor
在invokeBeanFactoryPostProcessors自动装配环节,解析@Bean注解,把TransactionInterceptor注入到BeanFactoryTransactionAttributeSourceAdvisor中 ,这个类提供了可配置的jta事务、ejb事务,都没有配置的情况走的就是spring的默认事务。
在finishBeanFactoryInitialization回调AbstractAutoProxyCreator#postProcessAfterInitialization方法的时候中使用AopProxyFactory 决定使用cglibProxy还是jdkproxy。
jdkproxy
org.springframework.aop.framework.JdkDynamicAopProxy#invoke
invocation.proceed()
org.springframework.transaction.interceptor.TransactionInterceptor#invoke
cglibProxy
org.springframework.aop.framework.CglibAopProxy.StaticUnadvisedInterceptor#intercept
org.springframework.aop.framework.CglibAopProxy
org.springframework.aop.framework.CglibAopProxy#getProxy(java.lang.ClassLoader)
cglib底层链路
org.springframework.aop.framework.DefaultAopProxyFactory#createAopProxy
org.springframework.aop.framework.ProxyFactory#getProxy(java.lang.ClassLoader)
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation
Bean注入
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean
org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean