JavaSpring动态原型bean
我想动态创建Spring原型bean(其中包含@Injects),但我不知道如何做到这一点。一个简单的例子:
@Named
public class Foo{
public void someMethod(){
for(int x=0; x < 10; x++){
MyObject obj = new MyObject(); // How would this work with Prototype
obj.setSomeField("Hello");
}
}
}
@Named
@Scope("prototype")
public class MyObject{
@Inject
SomeDependency blah;
public void setSomeField(String word){}
}
如果我将类Foo修改为如下所示,我就不能保证有一个新实例:
@Named
public class Foo{
@Inject MyObject obj;
public void someMethod(){
for(int x=0; x < 10; x++){
obj.setSomeField("Hello");
}
}
}
如果我创建一个配置类,它似乎也会保持为一个单例
public class Configuration {
@Bean
public MyObject getMyObject(){
return new MyObject();
}
}
@Named
public class Foo{
@Inject Configuration config;
public void someMethod(){
for(int x=0; x < 10; x++){
MyObject obj = config.getMyObject();
obj.setSomeField("Hello");
}
}
}
我错过什么了吗
更新
最后我把所有提到的东西都混合了起来
我用@Named和@Scope(“prototype”)标记非单例,并使用一种通用方法调用它们:
@Named
public MyFileFactory implements ApplicationContextAware{
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext ac) throws BeansException {
context = ac;
}
public <T> T getNewInstance(final Class<T> type) {
return context.getBean(type);
}
}
例:
@Named
public class SomeClass{
@Inject
private MyFileFactory myFileFactory;
public void foo(){
final MyObject myObject = myFileFactory.getNewInstance(MyObject.class);
}
}
# 1 楼答案
也许
@Configurable
注释就是您想要的:documentation如果使用
@Configurable
注释实例化对象,spring将对这些对象执行依赖项注入# 2 楼答案
我将使用“工厂”来创建
MyObject
的实例然后,我将把这个工厂
@Inject
放入我的Foo
对象中。在那里,每当我需要一个,我都可以要求一个新的例子如果希望通过Spring中的Bean配置新实例,可能需要将它们注入工厂,并在返回之前设置对象。比如: