我有一个spring应用程序,我试图注入许多相同类型的bean。我不知道在运行之前会有多少这些bean,所以使用工厂模式似乎很自然,因为我无法在我的java配置类中配置每个bean。但是,这些bean需要将一些字段连接到Spring,当我在工厂中使用“new”创建它们时,它们当然不是Spring管理的。
有没有办法让我在工厂类中创建的bean由Spring管理?或者工厂模式是错误的做法?
我发布时相当新,所以如果有必要提供更多信息,请告诉我。
答案 0 :(得分:1)
由于bean的数量可变,您无法使用@Autowired
,但您仍然可以使用ApplicationContextAware来创建获取bean。
使用它可以从Java代码中以编程方式创建原型bean,如果之前已在配置中定义了bean的类型,或者您可以使用new在工厂中创建新对象,然后使用此设置依赖项同样的方法。
这是一个实现的例子:
public final class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext CONTEXT;
public void setApplicationContext(ApplicationContext context) throws BeansException {
CONTEXT = context;
}
public static Object getBean(String beanName) {
return CONTEXT != null ? CONTEXT.getBean(beanName) : null;
}
public static <T> T getBean(Class<T> objectClass) {
return CONTEXT != null ? CONTEXT.getBean(objectClass) : null;
}
}
答案 1 :(得分:1)
您可以定义与bean所需的依赖关系连接的beanFactory,然后在beanFactory创建的每个新bean中手动注入它们。例如:
public class MyBean {
private Dependency1 dep1;
private Dependency2 dep2;
public MyBean(Dependency1 dep1, Dependency2 dep2) {
this.dep1 = dep1;
this.dep2 = dep2;
}
}
@Component
public class MyBeanFactory {
@Autowired
private Dependency1 dep1;
@Autowired
private Dependency2 dep2;
public MyBean createInstance() {
return new MyBean(dep1, dep2);
}
}
@Component
public class MyBeanConsumer {
@Autowired
private MyBeanFactory myBeanFactory;
public void foo() {
final MyBean bean = myBeanFactory.createInstance();
}
}