具有自动装配的Spring原型范围

时间:2013-10-24 07:29:09

标签: java spring spring-integration autowired

我有一个使用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时我都会获得一个新的帮助实例吗?

1 个答案:

答案 0 :(得分:8)

容器只创建一次单独的bean JobListener,因此只有一次机会来设置属性。每次需要时,容器都无法为bean JobListener提供新的bean Helper实例。

此问题的一个解决方案是使用Method InjectionLookup 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的新实例。