2011-12-13 26 views
0

财产我很新的春天和经历通过各种渠道(图书&互联网)的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> 

我们一直在硬编码VALU在这里15 & 0.5。 这里是我的问题:

  • 是否有可能通过这些值作为运行时间参数与范围为原型?
  • 如果是,我们该怎么做?请用一些例子来详细说明。
+0

你打算从哪里传递值?如果你通过ClassPathXmlApplicationContext加载bean,你可以得到bean并设置好属性。 –

回答

3

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

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

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

原理是尽可能地编程接口,所以你不要将自己绑定到任何特定的实现。但是,对于您正在考虑的情况,您只需在运行时传递值。

示例:BeanA需要DaoBean的服务,但DaBeBe不会被BeanA实例化。它将通过依赖注入传递给BeanA,BeanA只会跟DaoInterface交谈。

在这一点上,如果BeanA想要保存15和0.5,将用实际值(或更常见的变量)调用方法。

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

在这种情况下,我不使用依赖注入传递值。依赖注入是一个很好的工具,但并不意味着它必须在任何地方使用。

+0

这是否意味着bean内的属性值是该属性的一种“默认”值?再一次,我们可以得出结论:定义单例作用域的属性可能有一定的意义,但如果作用域是原型的话,那么使用属性值就无关紧要了。我在这里再一次假设bean正在被其他bean引用,即bean作为其他bean的属性。 – Sumit