java – 将动态属性映射读入Spring管理的bean
发布时间:2020-12-14 05:55:33 所属栏目:Java 来源:网络整理
导读:我有一个这样的属性文件: my.properties file:app.One.id=1app.One.val=60app.Two.id=5app.Two.val=75 我在Spring配置文件中将这些值读入我的bean中的map属性,如下所示: spring-config.xml:bean id="myBean" class="myClass" scope="singleton" property n
|
我有一个这样的属性文件:
my.properties file: app.One.id=1 app.One.val=60 app.Two.id=5 app.Two.val=75 我在Spring配置文件中将这些值读入我的bean中的map属性,如下所示: spring-config.xml:
<bean id="myBean" class="myClass" scope="singleton">
<property name="myMap">
<map>
<entry key="${app.One.id}" value="${app.One.val}"/>
<entry key="${app.Two.id}" value="${app.Two.val}"/>
</map>
</property>
</bean>
这样,如果我添加一个新的id / val到属性文件,我必须在config xml中添加一行,以便在myMap中有新的id / val. 我的问题是,有没有办法在spring配置文件中指定key-val对,以便xml中定义的key-val的数量可以找出属性文件中的项目并创建一个map.基本上我想在不同的环境中使用这个xml文件,我们在属性文件中使用不同数量的键值项.我只是不想在每个环境中更改xml文件以读取所有这些值. 如果您需要任何其他细节,请告诉我们任何想法/意见是赞赏.谢谢! 解决方法
这是使用Spring EL和自定义处理完成的.
尝试它是有趣的.有用 :) application.xml中 <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
">
<util:properties id="values" location="values.properties" />
<bean id="hello" class="my.Hello">
<property name="map"
value="#{T(my.Utils).propsToMap(values,'^(app.w*).id$','{idGroup}.val')}" />
</bean>
</beans>
Utils.java package my;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Utils {
public static Map<String,String> propsToMap(Properties props,String idPatternString,String valuePatternString) {
Map<String,String> map = new HashMap<String,String>();
Pattern idPattern = Pattern.compile(idPatternString);
for (Enumeration<?> en = props.propertyNames(); en.hasMoreElements();) {
String key = (String) en.nextElement();
String mapKey = (String) props.getProperty(key);
if (mapKey != null) {
Matcher idMatcher = idPattern.matcher(key);
if (idMatcher.matches()) {
String valueName = valuePatternString.replace("{idGroup}",idMatcher.group(1));
String mapValue = props.getProperty(valueName);
if (mapValue != null) {
map.put(mapKey,mapValue);
}
}
}
}
return map;
}
}
Hello.java package my;
import java.util.Map;
public class Hello {
private Map<String,String> map;
public Map<String,String> getMap() {
return map;
}
public void setMap(Map<String,String> map) {
this.map = map;
}
}
values.properties app.One.id=1 app.One.val=60 app.Two.id=5 app.Two.val=75 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
