我有一个使用Spring Integration监听队列的类JobListener
。在JobListener
内,我有Autowired
字段Helper
,其范围定义为“原型”。
public class JobListener {
@Autowired
private Helper helper;
@ServiceActivator
public void receiveMessage(Message<String> message){
helper.processMassage(message);
}
}
现在我的问题是,由于Helper的范围被定义为Protype
,每次调用recieveMessage
时我都会获得一个新的帮助实例吗?
答案 0 :(得分:8)
容器只创建一次单独的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 Framework将生成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
的新实例。