4

我有一个JobListener使用 Spring Integration 监听队列的类。在里面JobListener,我有一个范围被定义为“原型”的Autowired字段。Helper

public class JobListener {

@Autowired
private Helper helper;

@ServiceActivator
public void receiveMessage(Message<String> message){
    helper.processMassage(message);
    }
}

现在我的问题是,由于 Helper 的范围被定义为Protype,每次recieveMessage调用我都会得到一个新的 helper 实例吗?

4

1 回答 1

8

容器只创建JobListener一次单例 bean,因此只有一次机会设置属性。容器不能在每次需要时为 beanJobListener提供一个新的 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-methodJobListenerbean 定义中定义 name 的名称:

<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.

于 2013-10-24T08:13:42.557 回答