启用Spring事务管理@EnableTransactionManagement示例解析

 更新时间:2023年09月15日 11:09:15   作者:福  
这篇文章主要为大家介绍了启用Spring事务管理@EnableTransactionManagement示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Spring事务管理

Spring事务管理可以通过@EnableTransactionManagement注解开启,通过对@EnableTransactionManagement的分析,就能揭开Spring启用事务的底层机制。

直接开始源码分析。

@EnableTransactionManagement注解作用在配置类上,引入了TransactionManagementConfigurationSelector,这个先放一放,后面再分析。

@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;

定义了3个方法,我们逐个分析一下:

proxyTargetClass

boolean proxyTargetClass() default false;

Indicate whether subclass-based (CGLIB) proxies are to be created (true) as opposed to standard Java interface-based proxies (false). The default is false. Applicable only if mode() is set to AdviceMode.PROXY.
Note that setting this attribute to true will affect all Spring-managed beans requiring proxying, not just those marked with @Transactional. For example, other beans marked with Spring's @Async annotation will be upgraded to subclass proxying at the same time. This approach has no negative impact in practice unless one is explicitly expecting one type of proxy vs another, e.g. in tests.

决定采用CGLIB的方式(设置为TRUE)、还是JDK方式创建代理类(设置为false),默认值为false。仅在Mode设置为PROXY的情况下才有效。
需要注意的是设置为true后会影响所有的的被Spring管理的代理类的创建方式,不止是@Transactional注解标注的类。比如,其他的被@Async标注的类也会被影响。

大概意思是说,在Mode设置为PROXY的情况下,这个参数决定代理类的创建方式,设置为true则通过CGLIB方式创建代理对象,设置为false则通过JDK方式创建代理对象。默认是通过JDK方式创建。

但是为什么设置为true后会影响到不止是@Transactional注解标注的类,而是会影响到整个Spring管理的bean呢?待考证。

mode

AdviceMode mode() default AdviceMode.PROXY;
Indicate how transactional advice should be applied.
The default is AdviceMode.PROXY. Please note that proxy mode allows for interception of calls through the proxy only. Local calls within the same class cannot get intercepted that way; an Transactional annotation on such a method within a local call will be ignored since Spring's interceptor does not even kick in for such a runtime scenario. For a more advanced mode of interception, consider switching this to AdviceMode.ASPECTJ.

 事务advice(AOP概念)的实现方式,默认值为PXOXY,注意PROXY模式只允许通过代理方式调用,本地调用不生效。事务注解方法如果通过本地调用的话,事务处理不会生效,因为这种情况下Spring AOP的拦截机制不会生效。

JavaDoc说的很明白了,也是我们在其他文章里面提到过的,如果在同一个类中一个方法A调用被@Transactional标注的另外一个方法B的话,方法B的@Transactional不会生效,因为这种情况下的调用就属于这里所说的“本地调用”,没有调用到代理类,AOP拦截机制不会生效,因此方法B不会被AOP增强,因此事务不会生效。

Ordered

很熟悉的AOP增强概念,当多个拦截器生效的情况下,决定其顺序。

int order() default Ordered.LOWEST_PRECEDENCE;

好了,今天就到这里,由于Spring源码本身比较复杂,一次分析太多、文章太大的话,会比较乱,所以,改变一下思路,一篇文章只说一个概念,控制文章的篇幅,增强可读性。

以上就是启用Spring事务管理@EnableTransactionManagement示例解析的详细内容,更多关于Spring事务管理的资料请关注脚本之家其它相关文章!

相关文章

  • 如何用Java结合经纬度位置计算目标点的日出日落时间详解

    如何用Java结合经纬度位置计算目标点的日出日落时间详解

    这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友可以参考下
    2025-01-01
  • SPRING IOC注入方式过程解析

    SPRING IOC注入方式过程解析

    这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java进阶学习之如何开启远程调式

    Java进阶学习之如何开启远程调式

    Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,这篇文章主要介绍了Java进阶学习之如何开启远程调式的相关资料,需要的朋友可以参考下
    2025-03-03
  • idea在某天打开后一直在updating index的问题及解决

    idea在某天打开后一直在updating index的问题及解决

    idea长时间updatingindexs无法加载项目,原因是缓存文件异常或被安全软件清理,解决方法是点击File>InvalidateCaches...>InvalidateandRestart重新加载,或等待idea自动装配完毕
    2026-05-05
  • Struts2学习笔记(5)-参数传递方法

    Struts2学习笔记(5)-参数传递方法

    本文主要介绍Struts2中参数传递方法,希望能给大家做一个参考。
    2016-06-06
  • 深入理解Java遗传算法

    深入理解Java遗传算法

    这篇文章主要为大家详细介绍了Java遗传算法,本文对基因的编码采用二进制规则,分享了对Java遗传算法的理解,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • java寻找迷宫路径的简单实现示例

    java寻找迷宫路径的简单实现示例

    这篇文章主要介绍了java寻找迷宫路径的简单实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Java动态规划之丑数问题实例讲解

    Java动态规划之丑数问题实例讲解

    这篇文章主要介绍了Java动态规划之丑数问题实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09
  • 公共POI导出Excel方法详解

    公共POI导出Excel方法详解

    这篇文章主要介绍了公共POI导出Excel方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 基于CyclicBarrier和CountDownLatch的使用区别说明

    基于CyclicBarrier和CountDownLatch的使用区别说明

    这篇文章主要介绍了基于CyclicBarrier和CountDownLatch的使用区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09

最新评论