4

その場で (@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);
    }
}   
4

2 に答える 2

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);
    }
}
于 2013-03-15T19:22:14.513 に答える
0

多分@Configurable注釈はあなたが探しているものです:ドキュメント

@Configurable
public class MyObject {
   // ...
}

注釈スプリングでオブジェクトをインスタンス化すると、@Configurableこれらのオブジェクトに対して依存性注入が実行されます。

于 2013-03-15T19:15:22.903 に答える