使用Spring属性占位符从文件.properties中读取列表

时间:2009-10-21 06:40:51

标签: spring properties

我想使用Spring属性占位符填充bean列表属性。

上下文文件

<bean name="XXX" class="XX.YY.Z">
      <property name="urlList">
            <value>${prop.list}</value>
      </property>
</bean>

属性文件

prop.list.one=foo
prop.list.two=bar

非常感谢任何帮助

6 个答案:

答案 0 :(得分:12)

使用util:properties element加载您的媒体资源。您可以使用PropertyPlaceholderConfigurer指定文件的路径:

<bean name="XXX" class="XX.YY.Z">
  <property name="urlList">
    <util:properties location="${path.to.properties.file}"/>
  </property>
</bean>

更新我误解了这个问题;您只想返回键以特定字符串开头的属性。实现这一目标的最简单方法是在bean的setter方法中实现。您必须将字符串作为单独的属性传递给您的bean。扩展上述声明:

<bean name="XXX" class="XX.YY.Z" init-method="init">
  <property name="propertiesHolder">
     <!-- not sure if location has to be customizable here; set it directly if needed -->
    <util:properties location="${path.to.properties.file}"/>
  </property>
  <property name="propertyFilter" value="${property.filter}" />
</bean>

在你的XX.YY.Z bean中:

private String propertyFilter;
private Properties propertiesHolder;
private List<String> urlList;

// add setter methods for propertyFilter / propertiesHolder

// initialization callback
public void init() {
  urlList = new ArrayList<String>();
  for (Enumeration en = this.propertiesHolder.keys(); en.hasMoreElements(); ) {
    String key = (String) en.nextElement();
    if (key.startsWith(this.propertyFilter + ".") { // or whatever condition you want to check
      this.urlList.add(this.propertiesHolder.getProperty(key));
    }
  } // for
}

如果您需要在许多不同的地方执行此操作,可以将上述功能包装到FactoryBean中。

答案 1 :(得分:9)

更简单的解决方案:

class Z {
    private List<String> urlList;
    // add setters and getters
}

你的bean定义

<bean name="XXX" class="XX.YY.Z">
      <property name="urlList" value="#{'${prop.list}'.split(',')}"/>
</bean>

然后在您的属性文件中:

prop.list=a,b,c,d

答案 2 :(得分:5)

<bean id="cpaContextSource" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="urls">
    <bean class="org.springframework.util.CollectionUtils" factory-method="arrayToList">
        <constructor-arg type="java.lang.Object">
            <bean class="org.springframework.util.StringUtils" factory-method="tokenizeToStringArray">
                <constructor-arg type="java.lang.String" value="${myList}"/>
                <constructor-arg type="java.lang.String" value=" "/>
            </bean>
        </constructor-arg>
    </bean>
    </property>

其中:

myList=http://aaa http://bbb http://ccc

答案 3 :(得分:2)

我在这里看到的唯一方法是,实现接口“ MessageSourceAware ”以获取messageResource,然后手动填充列表。

class MyMessageSourceAwareClass implemets MessageSourceAware{
    public static MessageSource messageSource = null;

    public void setMessageSource(MessageSource _messageSource) {
        messageSource = _messageSource;
    }

    public static String getMessage( String code){
        return messageSource.getMessage(code, null, null );
    }

}

---属性文件---

prop.list=foo;bar;one more

像这样填充您的列表

String strlist = MyMessageSourceAwareClass.getMessage ( "prop.list" );

if ( StringUtilities.isNotEmptyString ( strlist ) ){
   String[] arrStr = strList.split(";");
   myBean.setList ( Arrays.asList ( arrStr ) );
}

答案 4 :(得分:2)

只需添加以下Bean定义

即可
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
        <value>classpath:myprops.properties</value>
    </list>
    </property>
</bean>

要像这样使用,请注意端口在myprops.properties中定义

<bean id="mybean" class="com.mycompany.Class" init-method="start">
    <property name="portNumber" value="${port}"/>
</bean>

答案 5 :(得分:-3)

有几种方法,其中一种方式如下。

XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("jdbc.properties"));
cfg.postProcessBeanFactory(factory);