我想动态创建Spring Prototype 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");
}
}
}
如果我创建一个Configuration类,它似乎仍然是一个Singleton
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);
}
}
答案 0 :(得分:2)
我会使用'工厂'来创建MyObject
的实例。
@Named
public class MyObjectFactory {
public MyObject newInstance() {
return new MyObject();
}
}
然后,我会将此工厂@Inject
编辑到我的Foo
对象中。在那里,每当我需要一个时,我都可以要求一个新实例。
如果希望通过Spring中的bean配置新实例,则可能必须将它们注入Factory,并在返回之前设置对象。像这样:
@Named
public class MyObjectFactory {
@Inject
private MyOtherObject otherObject;
public MyObject newInstance() {
return new MyObject(otherObject);
}
}
答案 1 :(得分:0)
也许@Configurable
注释正是您所寻找的:documentation
@Configurable
public class MyObject {
// ...
}
如果使用@Configurable
注释实例化对象,spring将对这些对象执行依赖注入。