我想使用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
非常感谢任何帮助
答案 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);