Spring同一个类中的方法互相调用,注解失效问题的分析和解决

Posted helios-fz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring同一个类中的方法互相调用,注解失效问题的分析和解决相关的知识,希望对你有一定的参考价值。

 

以Transaction注解为例:

@Service
public class TestService 

    @Autowired
    Dao dao;

    @Transactional
    public void methodOne(Object o) 
        dao.save(o);
    

    public void methodTwo(Object o) 
        methodOne(o);
    

检查事务是否启动:

设置log leve为debug,可以查看是否有下面这个log,判断是否启动了Transaction:
DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Creating new transaction with name...

原因:

Spring在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,Spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用方法之前就会启动Transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动Transaction,我们看到的现象就是@Transactional注解无效。

示例:

@Service
class TestService

    @Transactional
    void methodOne()
        ...
    

    void methodTwo()
        methodOne();
    


//Spring扫描注解后,创建了另外一个代理类,并为有注解的方法插入一个startTransaction()方法:
class proxy$TestService

    TestService testService = new TestService();

    void methodOne()
        startTransaction();
        testService.methodOne();
    

    void methodTwo()
        //由于methodTwo()没有注解,所以不会启动transaction,而是直接调用TestService的实例的methodTwo()方法
        testService.methodTwo(); 
    

解决方法:

1.把这两个方法分开到不同的类中。

2.把注解加到类名上面。

 

转自:https://blog.csdn.net/clementad/article/details/47339519

以上是关于Spring同一个类中的方法互相调用,注解失效问题的分析和解决的主要内容,如果未能解决你的问题,请参考以下文章

Spring @Cacheable注解 && 事务@Transactional 在同一个类中的方法调用不生效

在springBoot与quartz 整合中 @Transaction 失效

@Transational)的方法,注解失效的原因和解决方法

Spring aop注解失效

相同类中方法间调用时日志Aop失效处理

SpringBoot异步任务及Async不起作用的原因