【问题标题】:Spring prototype beans with parameters?带有参数的Spring原型bean?
【发布时间】:2016-08-09 23:11:20
【问题描述】:

是否可以定义一个 prototype bean,使用 XML 配置或基于注释的配置,以便我可以获得具有自定义参数值的 bean 实例?我的用例是一个消息队列处理程序,它使用入站消息中提供的不同参数值进行 API 调用。

在这种情况下,我似乎可以做以下两件事之一:

  • 获取我的原型范围 bean 的实例,然后调用 setter 对其进行自定义,使其特定于入站消息。
  • 使用普通的 new MyPrototypeBean() 构造 bean 类的新实例,然后调用 setter 来自定义实例。

也许我的问题的措辞不同:使用原型范围的 bean 与使用简单的 Java 构造函数有什么好处?

【问题讨论】:

    标签: java spring spring-bean prototype-scope


    【解决方案1】:

    要在将参数传递给构造函数时从另一个 bean 获取原型 bean,您可以使用 <lookup-method>(XML 配置)或 @Lookup(基于注释的配置)。

    如果您想从“非托管”代码(而不是 bean)中获取原型实例您不想使用查找方法,您可以使用 org.springframework.beans.factory.BeanFactory.getBean(String beanName, Object...) 实现相同的目的.

    回答您的第二个问题,原型范围 bean 和使用简单 Java 构造函数之间的区别在于原型范围 bean 仍然可以访问 Spring 容器的功能。这包括但不限于以下内容:它可以在 XML 配置 (<property name="someCollaborator" ref="..."/>) 或带有注释 (@Resource, @Autowired, ...) 中提供协作者,可以实现 Spring 感知接口(如ApplicationContextAware 以便原型 bean 本身可以访问容器)。

    【讨论】:

    • 谢谢,您可以编辑您的答案,将@Lookup 方法段落放在首位吗? Pivotal Support 确认了您的回答,并表示 @Lookup 是更好的方法,可能与您上面引用的原因相同。
    • 谢谢,我已经相应地重新安排了答案。
    • @PiotrFindeisen 我必须实现类似的东西。如何在运行时将对象传递给从 Spring Service Locator 获得的原型 bean。 Service Locator 方法只接受一个 String 参数,该参数基本上是到 spring bean id/name 的映射。
    • @bluelurker 抱歉,但我不知道 Spring Service Locator 是什么。
    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 2019-03-10
    相关资源
    最近更新 更多