我有一个实现了 W 接口(interface)的 B 类。它有一个 W 方法的默认实现。 C 类和 D 类覆盖默认实现,它们需要一个服务,其 bean 由 spring 实例化。字符串 a 和 b 来自用户,因此我无法提前创建 B/C/D 的 bean。所以我有一个工厂,它根据用户参数创建一个新对象(它将根据参数创建 B/C/D)。有什么干净的方法可以从 C 和 D 内部使用服务 bean(aa/bb/cc/dd 等)(服务器启动期间的 spring Autowiring ,当时实例化 B/C/D 所需的参数不可用)或有没有更好的方法来解决这个问题?
Class B implements W{
String a;
String b;
B (String a, String b);
w_method(){
}
}
Class C extends B {
@Autowired
Service aa;
@Autowired
Service bb;
@Autowired
Service cc;
@override
w_method(){
}
}
Class D extends B {
@Autowired
Service dd;
@override
w_method(){
}
}
最佳答案
存在三种可能的方法:
构造函数参数来自用户这一事实并不意味着这些对象不能由 Spring 创建。
您可以将它们声明为
prototype
范围的 Spring beans 并在您的工厂中执行以下操作:public C createC(String a, String b) { return applicationContext.getBean("c", a, b); }
此方法的缺点是您的工厂依赖于
ApplicationContext
。您可以使用
@Configurable
注释这些类并启用 AspectJ 编织。在这种情况下,即使您使用new
创建它们,Spring 也会配置这些类的对象。参见 7.8.1 Using AspectJ to dependency inject domain objects with Spring .您可以手动触发 Autowiring
applicationContext.getAutowireCapableBeanFactory().autowireBean(...);
当您无法控制需要 Autowiring 的对象(servlet 等)的创建时,此方法很有用。
关于java - 在运行时创建的对象中使用 Autowiring 的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312092/