【问题标题】:Spring prototype scope with autowired具有自动装配功能的 Spring 原型范围
【发布时间】:2013-11-02 18:54:30
【问题描述】:

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

【问题讨论】:

  • 快速回答,不,当 Spring 框架创建 JobListener 时,它会在创建类时自动装配助手,但每个引用助手的其他类都会有不同的实例
  • 在 receiveMessage helper = (Helper)context.getBean("helper");

标签: java spring spring-integration autowired


【解决方案1】:

容器只创建一次单例beanJobListener,因此只有一次机会设置属性。容器无法在每次需要时为 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 框架将生成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 的新实例。

【讨论】:

  • 感谢大家的帮助。您的及时回复节省了大量时间和返工。
猜你喜欢
  • 2013-01-29
  • 1970-01-01
  • 2018-09-27
  • 2011-05-06
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多