Spring - 手动创建组件时,@ Async无法正常工作

时间:2016-05-26 14:06:14

标签: java spring asynchronous

我在使用@Async在另一个类中手动实例化的组件上使用AutowireCapableBeanFactory注释:

AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory();
factory.autowireBean(object);
factory.initializeBean(object, "MyObject");

我的问题是调用object上的异步方法的类是手动创建Spring上下文,这意味着我无法在其中自动装配object,而@Async注释不会似乎在这种情况下工作。

这是我的春天上下文实例化:

@Component
@Scope("prototype")
@ComponentScan({ "com.package.my" })
public class Application {

    private static ApplicationContext applicationContext;

    public Application() {
        if (applicationContext == null) {
            applicationContext = new AnnotationConfigApplicationContext(Application.class);
        }
    }

}

我使用Proxy类来解决此问题,因为@Autowired在使用AutowireCapableBeanFactory时工作正常,所以我的对象已自动加入其中。

那就是说,我对这个解决方案并不满意,因为它要求我创建一个没有其他用途的中间类,我很确定手动@Async注释是可行的创建对象。

有更好的方法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

如果您真的没有选择权并且无法从ApplicationContext声明或检索该bean,那么您可以要求ApplicationContext准备好您的对象,就像它一样是一只豆子。

您使用的initializeBean方法实际上返回一个值,该值本身就是Spring处理版本。例如,如果Spring在对象之上应用自己的代理,它将返回代理。 javadoc

  

返回:要使用的bean实例,原始实例或包装实例

因此捕获其返回值并使用

object = factory.initializeBean(object, "MyObject");