簡體   English   中英

具有自動裝配的Spring原型范圍

[英]Spring prototype scope with autowired

我有一個使用Spring Integration監聽隊列的JobListener類。 JobListener ,我有一個Autowired字段Helper其范圍被定義為“prototype”。

public class JobListener {

@Autowired
private Helper helper;

@ServiceActivator
public void receiveMessage(Message<String> message){
    helper.processMassage(message);
    }
}

現在的問題是,由於助手的范圍被定義為Protype ,每次我會得到幫助的新實例recieveMessage叫?

容器只創建一次單獨的bean JobListener ,因此只有一次機會來設置屬性。 容器不能提供豆JobListener豆的一個新實例Helper每次需要一個時間。

此問題的一個解決方案是使用Method InjectionLookup method injection是容器覆蓋容器托管bean上的方法的能力,以返回容器中另一個命名bean的查找結果。 要實現此解決方案,請按以下步驟重新定義JobListener類:

public abstract class JobListener {

@ServiceActivator
public void receiveMessage(Message<String> message){
    Helper helper = createHelper();
    helper.processMassage(message);
    }

protected abstract Helper createHelper();
}

Spring Framework將生成一個JobListener的動態子類,它將覆蓋createHelper方法,以便在每次請求時提供Helper的新實例。

您需要在JobListener bean定義中定義lookup-method名稱:

<bean id="helper" class="x.y.Helper" scope="prototype">
...
</bean>

<bean id="jobListener" class="x.y.JobListener">
<lookup-method name="createHelper" bean="helper"/>
</bean>

每次執行時都有上述配置

Helper helper = createHelper();

它會返回一個新的Helper實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM