文末解释原因
注:@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版权协议,转载请附上原文出处链接和本声明。