Spring事务原理?事务在方法间如何传播?为什么会失效?( 三 )
< APC_PRIORITY_LIST.size(); i++) {Class> clazz = APC_PRIORITY_LIST.get(i);if (clazz.getName().equals(className)) {return i;}}throw new IllegalArgumentException("Class name [" + className + "] is not a known auto-proxy creator class"); }可以看到 , InfrastructureAdvisorAutoProxyCreator是优先级最低的 , 基本上不会起作用;AspectJAwareAdvisorAutoProxyCreator是当我们配置了标签时会注册 , 也就是xml配置的AOP的入口类;而AnnotationAwareAspectJAutoProxyCreator是当我们配置了或使用@EnableAspectJAutoProxy注解时注册 , 因此大部分情况下都是使用的AnnotationAwareAspectJAutoProxyCreator 。 注册完AOP的入口类后 , 回到configureAutoProxyCreator方法:
RootBeanDefinition sourceDef = new RootBeanDefinition("org.springframework.transaction.annotation.AnnotationTransactionAttributeSource");sourceDef.setSource(eleSource);sourceDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);String sourceName =parserContext.getReaderContext().registerWithGeneratedName(sourceDef);
AnnotationTransactionAttributeSource类的作用就是封装事务注解@Transactional的属性 , 这里需要记住其继承体系以及熟悉该类和其父类的属性和方法 , 对后面分析事物切面执行原理有帮助:
文章插图
紧接着就是创建了TransactionInterceptor对象 , 专门的事务拦截器 , 并且该类是MethodInterceptor的子类 , 看到这个应该不陌生了 , 我们知道AOP调用链在执行过程中主要就是调用该类的invoke的方法 , 因此它是事务切面执行的入口 。 既然有了Interceptor , 那么必不可少的还应该有Advisor , 而Advisor又是由Advice和Poincut组成的 , 这样才能构成一个完整的切面 , 所以该方法后面就是创建这两个对象 。 以上就是xml配置AOP注解支持的原理 , 很简单 , 下面再来看看零配置又是如何实现的 。
AOP零配置原理使用过SpringBoot的都知道 , 如果需要开启事务注解的支持 , 只需要一个注解就能搞定:@EnableTransactionManagement , 不用再配置xml文件 , 这个又是怎么做到的呢?不多说 , 我们直接来看其源码:
@Import(TransactionManagementConfigurationSelector.class)public @interface EnableTransactionManagement { boolean proxyTargetClass() default false; AdviceMode mode() default AdviceMode.PROXY; int order() default Ordered.LOWEST_PRECEDENCE;}
在该注解下使用@Import导入了一个类TransactionManagementConfigurationSelector , 首先该注解的作用就是导入一个类的实例到IOC容器中 , 你可能会说不是在类上加@Component注解就行了么 , 但是有些类它并不在你扫描的路径下 , 而该注解依然可以将其导入进来 , 所以我们主要看TransactionManagementConfigurationSelector类中做了些啥:
public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector
推荐阅读
- 基于Spring+Angular9+MySQL开发平台
- 苹果联合创始人的手绘Apple II电路原理图拍出63万美元高价
- C/C++协程学习笔记丨C/C++实现协程及原理分析视频
- 别不拿GateWay当回事,SpringCloud告诉你错了
- web 安全之 Spring Security 入门教程
- 前端路由简介以及vue-router实现原理
- Spring Application实例化流程和构造方法参数
- SpringBoot常用注解
- 抄github上的golang代码被坑后,弄懂了gin的原理
- 物理精神,科技创新的第一性原理是什么?