我有一个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实例。

09-04 09:09
查看更多