我有一个类JobListener,它使用Spring侦听队列。在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的新实例吗?
发布于 2013-10-24 08:13:42
容器只创建一次单例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的一个新实例。
https://stackoverflow.com/questions/19559620
复制相似问题