我有以下课程:
@Component
public class Foo {
@Async
public void test1() {
...
}
public void test2() {
test1();
}
}
另一个有Foo实例的类:
@Component
public class Bar {
@Autowired
public Foo foo;
public void testMethod() {
foo.test2();
foo.test1();
}
}
我的经验如下:如果我调用foo.test1()然后它以异步方式运行,但是如果我调用foo.test2() - 它也调用test1() - 那么test1()不会异步运行。任何人都可以解释这种行为吗?
答案 0 :(得分:3)
Async
行为要求对代理进行代理,并且不能代理自我调用。因此,当test2
调用test1
时,@Async
注释无效。
行为在AOP docs:
中描述但是,一旦调用最终到达目标对象,在这种情况下,SimplePojo引用,它可能对其自身进行的任何方法调用,例如this.bar()或this.foo(),将会是针对此引用而不是代理调用。这具有重要意义。这意味着自我调用不会导致与方法调用相关的建议有机会执行。