启用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 Fluent Mybatis 分页查询与sql日志输出详解流程篇

    Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    Java中常用的ORM框架主要是mybatis, hibernate, JPA等框架。国内又以Mybatis用的多,基于mybatis上的增强框架,又有mybatis plus和TK mybatis等。今天我们介绍一个新的mybatis增强框架 fluent mybatis关于分页查询、sql日志输出流程
    2021-10-10
  • Java基于ReadWriteLock实现锁的应用

    Java基于ReadWriteLock实现锁的应用

    这篇文章主要介绍了Java基于ReadWriteLock实现锁的应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java创建删除文件和目录的方法(推荐)

    Java创建删除文件和目录的方法(推荐)

    这篇文章主要介绍了java创建删除文件和目录的方法,创建和删除文件目录常用的是file类的方法,具体内容详情大家参考下本文
    2018-05-05
  • 使用Log4j2代码方式配置实现线程级动态控制

    使用Log4j2代码方式配置实现线程级动态控制

    这篇文章主要介绍了使用Log4j2代码方式配置实现线程级动态控制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java并发JUC工具包AtomicInteger原子整型语法基础

    java并发JUC工具包AtomicInteger原子整型语法基础

    这篇文章主要为大家介绍了java并发JUC工具包AtomicInteger原子整型语法基础,有需要的朋友可以借鉴参考希望能够有所帮助,祝大家多多进步
    2022-03-03
  • 使用java模拟简单的tomcat的方法详解

    使用java模拟简单的tomcat的方法详解

    这篇文章主要为大家详细介绍了java模拟简单的tomcat的方法,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 一文带你快速学会JDBC及获取连接的五种方式

    一文带你快速学会JDBC及获取连接的五种方式

    JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口,下面这篇文章主要给大家介绍了关于如何通过一文带你快速学会JDBC及获取连接的五种方式,需要的朋友可以参考下
    2022-09-09
  • 详解微信开发之access_token之坑

    详解微信开发之access_token之坑

    access_token分类一是普通access_token,二是网页授权access_token。这篇文章主要介绍了详解微信开发之access_token之坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Java实现三子棋小游戏

    Java实现三子棋小游戏

    这篇文章主要为大家详细介绍了Java实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Spring核心IoC和AOP的理解

    Spring核心IoC和AOP的理解

    本文主要介绍了Spring核心IoC和AOP的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03

最新评论