その場で (@Injects を含む) Spring Prototype Bean を作成したいのですが、これを行う方法がわかりません。簡単な例:
@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);
}
}