容器只創建一次singleton bean JobListener
,因此只有一次機會來設置屬性。每次需要時,容器都不能向豆JobListener
提供一個新的bean實例Helper
。
解決此問題的一種方法是使用Method Injection
:Lookup 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
。
快速回答,不,當JobListener由Spring框架創建時,它會在創建類時自動調用幫助程序,但是每個其他類都有一個對Helper的引用,在receiveMessage內有不同的實例 – RamonBoza
helper =(Helper) context.getBean(「helper」);' – RamonBoza