2013-10-24 63 views
4

我有一個類JobListener,它使用Spring集成監聽隊列。在JobListener裏面,我有一個Autowired字段Helper,其範圍被定義爲「原型」。具有自動佈線功能的彈簧原型示波器

public class JobListener { 

@Autowired 
private Helper helper; 

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

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

+0

快速回答,不,當JobListener由Spring框架創建時,它會在創建類時自動調用幫助程序,但是每個其他類都有一個對Helper的引用,在receiveMessage內有不同的實例 – RamonBoza

+1

helper =(Helper) context.getBean(「helper」);' – RamonBoza

回答

7

容器只創建一次singleton bean JobListener,因此只有一次機會來設置屬性。每次需要時,容器都不能向豆JobListener提供一個新的bean實例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框架將產生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

+0

謝謝大家的幫助。您的即時回覆節省了大量時間和返工。 – Ayushi

+0

@Ayushi歡迎您。 –