Spring - 手动创建组件时 @Async 不起作用

2024-04-21

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

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手动创建对象时注释起作用。

有一个更好的方法吗 ?

Thanks.


如果您确实别无选择并且无法从ApplicationContext,那么你可以询问ApplicationContext准备你的物体,就好像它是一颗豆子一样。

The initializeBean您使用的方法实际上返回一个值,该值是 Spring 处理后的版本。例如,如果 Spring 在对象之上应用它自己的代理,它将返回代理。这javadoc http://docs.spring.io/spring-framework/docs/current/javadoc-api/ states

Returns:要使用的 bean 实例,可以是原始实例,也可以是包装实例

因此捕获它的返回值并使用它

object = factory.initializeBean(object, "MyObject");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring - 手动创建组件时 @Async 不起作用 的相关文章

随机推荐