2017-05-08 13 views
0

私はプロトタイプのスコープで次の春のbeanを持っています。 AppRunnerクラスでは、forループ内で新しいbeanをSpringで注入したいと考えています(ループカウントが2の場合、2つの新しいbeanを注入したいだけです)。Spring BeanはPrototypeスコープでどのように動作しますか?

しかし、SpringはSimpleBeanのsetterメソッドが呼び出されるたびに新しいBeanを挿入します。

SimpleBean.java

@Component 
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = 
ScopedProxyMode.TARGET_CLASS) 
public class SimpleBean { 
    private String id; 
    private Long value; 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public Long getValue() { 
     return value; 
    } 

    public void setValue(Long value) { 
     this.value = value; 
    } 
} 

AppRunner.java

@Component 
public class AppRunner { 

    @Autowired 
    SimpleBean simpleBean; 

    public void execute(List<Output> results){ 
     List<SimpleBean> finalResults = new ArrayList<SimpleBean>(); 
     for(Output o : results){ 
      simpleBean.setId(o.getAppId()); 
      simpleBean.setValue(o.getAppVal()); 
      finalResults.add(simpleBean); 
     } 
    } 
} 

Output.java

public class Output { 
    private String appId; 
    private Long appVal; 

    public String getAppId() { 
     return appId; 
    } 

    public void setAppId(String appId) { 
     this.appId = appId; 
    } 

    public Long getAppVal() { 
     return appVal; 
    } 

    public void setAppVal(Long appVal) { 
     this.appVal = appVal; 
    } 
} 

答えて

0

残念ながらプロトタイプの範囲は次のように動作しません。コンテナによってAppRunnerのBeanがインスタンス化されると、その依存関係が要求されます。次に、新しいインスタンスSimpleBeanが作成されます。このインスタンスは依存関係のままです。 SimpleBeanに依存する複数のBeanを持つ場合、プロトタイプスコープが動作し始めます。 Like:

@Component 
class BeanOne { 
    @Autowired 
    SimpleBean bean; //will have its own instance 
} 

@Component 
class BeanTwo { 
    @Autowired 
    SimpleBean bean; //another instance 
} 

希望の動作につながる簡単なアップデートがあります。 autowired依存関係を削除して、ループから新しい依存関係をコンテキストから尋ねることができます。それはこのようになります。

@Component 
public class AppRunner { 

    @Autowired 
    ApplicationContext context; 

    public void execute(List<Output> results){ 
     List<SimpleBean> finalResults = new ArrayList<SimpleBean>(); 
     for(Output o : results) { 
      SimpleBean simpleBean = context.getBean(SimpleBean.class); 
      simpleBean.setId(o.getAppId()); 
      simpleBean.setValue(o.getAppVal()); 
      finalResults.add(simpleBean); 
     } 
    } 
} 

他の選択肢は、Method injectionと呼ばれる技術とすることができる。プロトタイプのスコープについては、関連ドキュメントに記載されています。ここをクリックしてください。7.5.3 Singleton beans with prototype-bean dependencies

+0

ありがとうございます。 – Vel

関連する問題