# 《Spring核心技术》第32章:深度解析@EnableTransactionManagement注解
作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码地址:https://github.com/binghe001/spring-annotation-book/tree/master/spring-annotation-chapter-29 (opens new window)
沉淀,成长,突破,帮助他人,成就自我。
大家好,我是冰河~~
本章难度:★★★★☆
本章重点:从源码级别彻底掌握@EnableTransactionManagement注解在Spring底层开启事务的执行流程。
本章目录如下所示:
- 学习指引
- 注解说明
- 注解源码
- 使用场景
- 源码时序图
- 源码解析
- 解析解析总体流程类
- 解析AutoProxyRegistrar类
- 解析InfrastructureAdvisorAutoProxyCreator类
- 解析ProxyTransactionManagementConfiguration类
- 总结
- 思考
- VIP服务
# 一、学习指引
Spring中的@EnableTransactionManagement注解,你真的彻底了解过吗?
基于Spring事务开发过应用程序的小伙伴都知道,在配置类上添加@EnableTransactionManagement注解后,就能够开启Spring事务,那你知道@EnableTransactionManagement注解在Spring底层都做了哪些事情吗?
# 二、注解说明
关于@EnableTransactionManagement注解的一点点说明~~
在配置类上标注@EnableTransactionManagement注解后,就表示程序开启了基于注解的Spring事务功能,那@EnableTransactionManagement注解中都包含哪些信息呢?
# 2.1 注解源码
@EnableTransactionManagement注解的源码详见:org.springframework.transaction.annotation.EnableTransactionManagement。
/**
* @author Chris Beams
* @author Juergen Hoeller
* @since 3.1
* @see TransactionManagementConfigurer
* @see TransactionManagementConfigurationSelector
* @see ProxyTransactionManagementConfiguration
* @see org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration
*/
@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;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@EnableTransactionManagement注解表示Spring支持基于注解的事务,同时开启了事务。从源码可以看出,@EnableTransactionManagement注解是从Spring3.1版本开始提供的注解,并且在注解上使用@Import注解导入了TransactionManagementConfigurationSelector类,TransactionManagementConfigurationSelector类就是@EnableTransactionManagement注解的核心所在。另外,在@EnableTransactionManagement注解中提供了三个属性,分别如下所示。
- proxyTargetClass:boolean类型的属性,表示指定目标类代理还是指定接口代理。取值为true或者false,true:指定目标类代理,此时会使用CGLib代理,false:指定接口代理,此时会使用JDK代理。默认取值为false,使用JDK代理接口。
- mode:AdviceMode枚举类型的属性,表示事务通知是如何执行的。取值为PROXY或者ASPECTJ,PROXY:事务会通过代理的方式执行,ASPECTJ:事务会通过aspectj的方式执行。如果是同一个类中调用的话,可以指定为ASPECTJ。
- order:表示事务处理的执行顺序,默认值为Ordered.LOWEST_PRECEDENCE,也就是最低优先级,实际值为:Integer.MAX_VALUE。
# 查看完整文章
加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码