gpt4 book ai didi

java - 带有 Autowiring 的 Spring 原型(prototype)作用域

转载 作者:搜寻专家 更新时间:2023-11-01 01:43:36 24 4
gpt4 key购买 nike

我有一个类 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 实例吗?

最佳答案

容器只创建单例 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 实例被要求。

你需要在JobListener bean定义中定义lookup-method名称:

<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 实例。

关于java - 带有 Autowiring 的 Spring 原型(prototype)作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19559620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com