我有一个JobListener
类,正在使用Spring Integration监听队列。在JobListener
内部,我有一个Autowired
字段Helper
,其范围定义为“原型(prototype)”。
public class JobListener {
@Autowired
private Helper helper;
@ServiceActivator
public void receiveMessage(Message<String> message){
helper.processMassage(message);
}
}
现在我的问题是,由于Helper的范围定义为
Protype
,每次调用recieveMessage
时我都会得到一个新的helper实例吗? 最佳答案
容器仅创建一次singleton bean JobListener
,因此只有一次机会来设置属性。每次需要一个容器时,容器都无法为bean 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
的新实例。您需要在
lookup-method
bean定义中定义JobListener
名称的名称:<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
实例。