spring-boot 调用本类@Async注解的方法不生效解决办法

文末解释原因

注:@Transactional不生效的原因也是

 

不生效的代码:

@Component
public class AsycnTest {
    
    public void test(){
        testAsync();
    }
    
    @Async
    public void testAsync(){

    }
}    

解决方案:

方案一、将方法抽离出去,再调用

1、主类

@Component
public class AsycnTest {
    
    @Autowired
    private Test test;

    public void test(){
        test.testAsync();
    }
    
}    

2、抽离出去的方法类

@Component
public class Test {

    @Async
    public void testAsync(){

    }

}

方案二、注入当前类,在用注入的类调用该方法。一定记住加@Lazy注解,防止循环注入

@Component
public class AsycnTest {
	
	@Lazy
    @Autowired
    private AsycnTest asycnTest;

    public void test(){
        asycnTest.testAsync();
    }

    @Async
    public void testAsync(){

    }
}

不能调用的原因:

1、先看spring怎么实现的:spring 在扫描bean的时候会扫描该类的方法上是否包含 @Async 注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类 proxy),代理类是继承原来那个bean的,并且重写了父类中被 @Async 注解的方法(如果该注解是加在了类上,则会重写该类的所有方法),并利用AOP切面为这些方法加上异步逻辑

 

2、原因:当这个有注解的方法被调用的时候,实际上调用的是代理类中重写过的方法。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么就不会调用该代理类了,而是直接通过当前对象去调,所以也就不生效了,所以我们看到的现象就是该异步方法没有生效。


版权声明:本文为weixin_40841731原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。