我在使用@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
注释是可行的创建对象。
有更好的方法吗?
感谢。
答案 0 :(得分:2)
如果您真的没有选择权并且无法从ApplicationContext
声明或检索该bean,那么您可以要求ApplicationContext
准备好您的对象,就像它一样是一只豆子。
您使用的initializeBean
方法实际上返回一个值,该值本身就是Spring处理版本。例如,如果Spring在对象之上应用自己的代理,它将返回代理。 javadoc州
返回:要使用的bean实例,原始实例或包装实例
因此捕获其返回值并使用
object = factory.initializeBean(object, "MyObject");