Spring @Async双重行为

时间:2015-06-24 14:09:24

标签: java spring

我有以下课程:

@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()不会异步运行。任何人都可以解释这种行为吗?

1 个答案:

答案 0 :(得分:3)

Async行为要求对代理进行代理,并且不能代理自我调用。因此,当test2调用test1时,@Async注释无效。

行为在AOP docs

中描述
  

但是,一旦调用最终到达目标对象,在这种情况下,SimplePojo引用,它可能对其自身进行的任何方法调用,例如this.bar()或this.foo(),将会是针对此引用而不是代理调用。这具有重要意义。这意味着自我调用不会导致与方法调用相关的建议有机会执行。