【问题标题】:Inject Dynamic Values for the property in Spring在 Spring 中为属性注入动态值
【发布时间】:2011-12-13 16:06:57
【问题描述】:

我对 Spring 非常陌生,在通过各种资源(书籍和 Internet)浏览 DI 主题时,我看到了以下定义 bean 配置的模式:

例如我们有一个类“SampleApp”

public class SampleApp
{
    private int intValue;
    private float floatValue;

    public SampleApp(int value)
    {
      intValue = value;
    }

    public void setIntValue(int value)
    {
      intValue = value;
    }

    public void setFloatValue(float floatValue)
    {
      this.floatValue = floatValue;
    }
}

对应的bean配置如下:

 <bean class="somepackage.SampleApp" id="samplebeanapp">
    <constructor-arg value="15" />
    <property value="0.5" name="floatValue"></property>
 </bean>

我们已将此处的值硬编码为 15 和 0.5。 这是我的问题:

  • 是否可以将这些值作为运行时参数传递,范围作为原型?
  • 如果是,我们该怎么做?请举例说明。

【问题讨论】:

  • 您建议从哪里传递值?如果您通过 ClassPathXmlApplicationContext 加载 bean,您可以获取 bean 并设置属性。

标签: spring code-injection


【解决方案1】:

Spring 配置文件在启动时被处理,并且 Spring 单例 bean 也在那个时候被实例化。在正常情况下,它们不会在应用程序生命周期内再次处理。

您可以使用这种类型的属性注入来传递配置值,同时您可以使用对象引用的注入来确定应用程序的结构。

为避免对 XML 文件中的值进行硬编码,您可以使用 PropertyPlaceholderConfigurer 将它们提取到属性文件中。

原则是尽可能多地对接口进行编程,因此您不要将自己束缚于任何特定的实现。但是,对于您正在考虑的情况,您只需在运行时传递值。

示例:BeanA 需要 DaoBean 的服务,但 DaoBean 不会被 BeanA 实例化。它将通过依赖注入传递给 BeanA,而 BeanA 只会与 DaoInterface 对话。

此时如果 BeanA 想保存 15 和 0.5,将调用具有实际值(或更常见的变量)的方法。

daoInterface.saveInt(15);
daoInterface.saveFloat(0.5);

在这种情况下,我不使用依赖注入来传递值。依赖注入是一个很棒的工具,但并不意味着它必须无处不在。

【讨论】:

  • 这是否意味着 bean 中的属性值是该属性的一种“默认”值?再次得出结论,为单例范围定义属性可能有一些意义,但如果范围是原型,则使用属性值是无关紧要的。我再次假设该 bean 被其他一些 bean 引用,即 bean 充当其他一些 bean 的属性。
猜你喜欢
  • 2015-07-03
  • 2012-11-30
  • 1970-01-01
  • 2011-01-05
  • 2011-11-13
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 2011-02-15
相关资源
最近更新 更多