这是问题 -
我使用 Spring 提供的 @Async 来异步执行一些方法。但是,因为它是基于代理的,所以如果从同一个类中调用该方法,它将不起作用。我确实需要从同一个类中调用我的异步方法。
我知道如果我使用 AspectJ 而不是 Spring AOP,我将能够做到这一点。
所以我的问题是,有没有办法使用 Spring 的 @Async 和加载时间编织它?或者,是否已经编写了一个我可以使用的基于 AspectJ 的异步执行方面,而不是自己编写?
这是问题 -
我使用 Spring 提供的 @Async 来异步执行一些方法。但是,因为它是基于代理的,所以如果从同一个类中调用该方法,它将不起作用。我确实需要从同一个类中调用我的异步方法。
我知道如果我使用 AspectJ 而不是 Spring AOP,我将能够做到这一点。
所以我的问题是,有没有办法使用 Spring 的 @Async 和加载时间编织它?或者,是否已经编写了一个我可以使用的基于 AspectJ 的异步执行方面,而不是自己编写?
是的,用 注释一个具体类的方法@Async
,将spring-aspects
JAR(其中包含异步方面)放入您的类路径中,<task:annotation-driven mode="aspectj" />
在您的 Spring 配置中使用并应用编译时或加载时编织,spring-aspects
作为方面库引用。
您可以做的一件事是将一个 bean 扔在一起,其唯一目的是异步运行事物并将工作传递给方法内的它。如果您想将 @Async 放在您的接口或其他东西上,这可能不会使 API 变得漂亮,但它可以完成工作。
public interface AsyncExecutor {
void runAsynchronously(Runnable r);
}
public class SpringAOPAsyncExecutor implements AsyncExecutor {
@Async
@Override
public void runAsynchronously(Runnable r) {
r.run();
}
}
public MyService implements SomeInterface {
@Autowired
private AsyncExecutor springAOPAsyncExecutor;
public ObjectHolder calculateAsychronously() {
final ObjectHolder resultHolder = new ObjectHolder();
springAOPAsyncExecutor.runAsynchronously ( new Runnable() {
public void run() {
//do some calculatin
resultHolder.setValue(whatevs);
}
});
return resultHolder;
}
}