【问题标题】:Spring - @Async not working when the component is manually createdSpring - 手动创建组件时@Async不起作用
【发布时间】:2016-05-26 14:06:14
【问题描述】:

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

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

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

这是我的 spring 上下文实例化:

@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 注释时可以工作对象。

有没有更好的方法来做到这一点?

谢谢。

【问题讨论】:

  • 不要手动创建对象(也不要创建上下文实例,除非你想有奇怪的内存问题、事务奇怪等)。
  • 捕获并使用initializeBean的返回值。
  • @M.Deinum 我别无选择,我的应用程序被用作另一个不是 Spring 应用程序的应用程序的库。
  • @SotiriosDelimanolis 它确实有效,谢谢。我让你发布一个答案,这样你就可以得到它的功劳:)

标签: java spring asynchronous


【解决方案1】:

如果您真的别无选择并且无法从 ApplicationContext 声明或检索 bean,那么您可以要求 ApplicationContext 准备您的对象,就好像它是一个 bean。

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

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

所以捕获它的返回值并使用它

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多