我们表达这个概念的时候,我也希望大家能够来按照两个部分来介绍:第一部分代理创建,第二我们的调用过程,尤以,TransactionInfo,还有我们的这个createTransactionIfNecessary最为重要。
1. 利用注解@EnableTransactionManagement导入了@Import(TransactionManagementConfigurationSelector.class)
开启事物
| @Import(TransactionManagementConfigurationSelector.class) |
| public @interface EnableTransactionManagement {} |
2. TransactionManagementConfigurationSelector实现了ImportSelector接口,会被ConfigurationClassPostProcessor类进行解析
| public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> { |
| |
| @Override |
| protected String[] selectImports(AdviceMode adviceMode) { |
| switch (adviceMode) { |
| case PROXY: |
| return new String[] {AutoProxyRegistrar.class.getName(), |
| ProxyTransactionManagementConfiguration.class.getName()}; |
| case ASPECTJ: |
| return new String[] {determineTransactionAspectClass()}; |
| default: |
| return null; |
| } |
| } |
| |
| private String determineTransactionAspectClass() { |
| return (ClassUtils.isPresent("javax.transaction.Transactional", getClass().getClassLoader()) ? |
| TransactionManagementConfigUtils.JTA_TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME : |
| TransactionManagementConfigUtils.TRANSACTION_ASPECT_CONFIGURATION_CLASS_NAME); |
| } |
| |
| } |
①. TransactionManagementConfigurationSelector导入两个核心类
| ○ AutoProxyRegistrar |
| ○ ProxyTransactionManagementConfiguration |
1. AutoProxyRegistrar实现了ImportBeanDefinitionRegistrar接口,也会被ConfigurationClassPostProcessor类解析
默认为AdviceMode.PROXY
| |
| |
| |
| @Target(ElementType.TYPE) |
| @Retention(RetentionPolicy.RUNTIME) |
| @Documented |
| @Import(TransactionManagementConfigurationSelector.class) |
| public @interface EnableTransactionManagement { |
| |
| |
| boolean proxyTargetClass() default false; |
| |
| AdviceMode mode() default AdviceMode.PROXY; |
| |
| int order() default Ordered.LOWEST_PRECEDENCE; |
| |
| } |
用于创建事物代理的BeanPostProcessor
| public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, @Nullable Object source) { |
| |
| return registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source); |
| } |
1. InfrastructureAdvisorAutoProxyCreator继承自AbstractAutoProxyCreator(和AnnotationAwareAspectJAutoProxyCreator(用于处理AOP的BeanPostProcessor)一样)

2. ProxyTransactionManagementConfiguration是被TransactionManagementConfigurationSelector导入的配置类
| 1. ProxyTransactionManagementConfiguration是一个配置类,被@Configuration标注了 |
| 2. transactionAdvisor这个方法,创建的是 事物切面Bean,也就是Advisor |
| 3. transactionAttributeSource这个方法,切入点在事务配置中,切入点的表现形式?事务属性形式表达由transactionAtrributesSource 体现 |
| 4. transactionInterceptor,额外功能TransactionInterceptor体现 额外功能 里面包装TransactionManager |
配置类
| @Configuration |
| public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration { |
| |
| @Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME) |
| @Role(BeanDefinition.ROLE_INFRASTRUCTURE) |
| public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() { |
| BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor(); |
| advisor.setTransactionAttributeSource(transactionAttributeSource()); |
| advisor.setAdvice(transactionInterceptor()); |
| if (this.enableTx != null) { |
| advisor.setOrder(this.enableTx.<Integer>getNumber("order")); |
| } |
| return advisor; |
| } |
| |
| @Bean |
| @Role(BeanDefinition.ROLE_INFRASTRUCTURE) |
| public TransactionAttributeSource transactionAttributeSource() { |
| return new AnnotationTransactionAttributeSource(); |
| } |
| |
| @Bean |
| @Role(BeanDefinition.ROLE_INFRASTRUCTURE) |
| public TransactionInterceptor transactionInterceptor() { |
| TransactionInterceptor interceptor = new TransactionInterceptor(); |
| interceptor.setTransactionAttributeSource(transactionAttributeSource()); |
| if (this.txManager != null) { |
| interceptor.setTransactionManager(this.txManager); |
| } |
| return interceptor; |
| } |
| |
| } |
3. 执行sql操作的流程,会由InfrastructureAdvisorAutoProxyCreator这个BeanPostProcessor创建的代理类进行操作
被事物控制的方法
| public class TestAnnotationTx { |
| public static void main(String[] args) { |
| AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class); |
| UserService userService = (UserService) ctx.getBean("userServiceImpl"); |
| |
| User user = new User(); |
| user.setName("sunshuai"); |
| user.setVers(1); |
| |
| userService.register(user); |
| } |
| } |
| ○ 代码中的userService是被代理的类 |
| ○ 调用userService.register(user)方法时,会进行aop事物增强 |
| ○ 会在createTransactionIfNecessary方法中,根据事物属性(隔离、传播、只读、超时、异常)进行判断,是否创建事物 |
1. Spring利用AOP控制事物,封装了一个类:TransactionInfo
| |
| private final PlatformTransactionManager transactionManager; |
| |
| private final TransactionAttribute transactionAttribute; |
| |
| private final String joinpointIdentification; |
| |
| |
| |
| |
| |
| private TransactionStatus transactionStatus; |
| |
| private TransactionInfo oldTransactionInfo; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix