我有一个spring应用程序,我试图在其中注入许多相同类型的bean。我不知道在运行之前会有多少这些bean,所以使用工厂模式似乎很自然,因为我无法在java配置类中配置每个bean。然而,这些bean需要有一些由Spring连接的字段,当我在工厂中使用"new"创建它们时,它们当然不是Spring管理的。
是否有一种方法可以让我在工厂类中创建的bean由Spring管理?或者工厂模式是错误的方法?
我是一个新手,所以如果需要更多的信息,请告诉我。
您可以定义一个连接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();
}
}
您不能使用@Autowired
,因为bean的数量是可变的,但是您仍然可以使用ApplicationContextAware来创建获取bean。
如果bean的类型之前在配置中已经定义,那么您可以使用该方法从Java代码以编程方式创建原型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;
}
}