spring 对<tx:annotation-driven>的处理过程

1月 28, 2018 |

spring 对的处理过程

1、解析xml的元素, 生成对应的beanDefination

AnnotationDrivenBeanDefinitionParser类负责解析xml的<tx:annotation-driven>元素,
往DefaultListableBeanFactory中添加beanDefination的具体逻辑在AnnotationDrivenBeanDefinitionParser.AopAutoProxyConfigurer方法中。
依次添加了
InfrastructureAdvisorAutoProxyCreator 实现了InstantiationAwareBeanPostProcessor接口, 根据AnnotationTransactionAttributeSource匹配合适的BeanFactoryTransactionAttributeSourceAdvisor, 然后根据BeanFactoryTransactionAttributeSourceAdvisor产生代理类。
AnnotationTransactionAttributeSource 获取事务的元数据, 比如解析@Transactional注解,在AOP中担任pointcut的角色
TransactionInterceptor 实现了MethodInterceptor接口, 拦截方法的执行,如果方法添加了@Transactional, 为其添加事务的功能
BeanFactoryTransactionAttributeSourceAdvisor 具体的Advisor实现,用aop的术语, 这个类的advice属性指向TransactionInterceptor, pointcut属性指向AnnotationTransactionAttributeSource

2、根据beanDefination生成对应的实例

当DefaultListableBeanFactory.doCreateBean中根据beanDefination生成实例后, 会调用
InfrastructureAdvisorAutoProxyCreator.postProcessAfterInitialization方法来为该bean 生成代理,

3、执行@Transactional方法时

如果使用jdk代理, JdkDynamicAopProxy.invoke方法得以执行, 依次执行如下方法
ProxyFactory.getInterceptorsAndDynamicInterceptionAdvice
DefaultAdvisorChainFactory.getInterceptorsAndDynamicInterceptionAdvice
DefaultAdvisorAdapterRegistry.getInterceptors, 遍历Advisor, 获取能作用于该方法调用的advice(也就是MethodInterceptor接口的实现,本例中获取到的实例就为TransactionInterceptor), 最后事务rollback等相关的逻辑在TransactionInterceptor.invokeWithinTransaction中实现的。

Posted in: spring practise

Comments are closed.