将动态属性映射读入Spring托管bean
我有这样的属性文件:
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:
这样,如果我向属性文件添加一个新的id / val,我必须在config xml中添加一行,以便在myMap中拥有新的id / val。
我的问题是,有没有办法在spring配置文件中指定key-val对,以便xml中定义的key-val数量可以计算出属性文件中的项目并创建一个map。 基本上我想在不同的环境中使用这个xml文件,我们在属性文件中使用不同数量的键值项。 我只是不想在每个环境中更改xml文件以读取所有这些值。
如果您需要任何其他细节,请告诉我。 任何想法/意见表示赞赏。 谢谢!
这是通过Spring EL和自定义处理完成的。
尝试它对我来说很有意思。 有用 :)
application.xml中
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 propsToMap(Properties props, String idPatternString, String valuePatternString) { Map map = new HashMap(); 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 map; public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } }
values.properties
app.One.id=1 app.One.val=60 app.Two.id=5 app.Two.val=75
也许我没有完全理解这里的问题……
简化方法怎么样?
my.properties file: 1=60 5=75
应用背景
classpath: my.properties
Java Bean
public class MyClass { private Map myMap; public void setMyMap(Map myMap) { this.myMap = myMap; } public Map getMyMap(){ return myMap; } }
这是一个典型的环境问题。
有两种方法可以做到这一点:
- 在相应的.properties文件末尾添加环境字符串; 在启动时将该值传递给应用程序,让Spring选择正确的值。
- 将这些动态属性放在数据库中并在启动时查询它们。 数据库的JNDI将选择正确的值。
我没有找到解决此问题的理想方法,将动态地图属性读入弹簧配置信息。 使用DB也不是我们的选择。 这是我发现的最佳选择:
-
在属性文件中使用映射键/值对的标准格式,例如:key1 | val1,key2 | val2,key3 | val3,…,keyn | VALN
-
将此读取到配置bean中的String属性或List属性,如下所示: 使用String to List
-
让注入java类将项目拆分为setter中的map。
我打算将此标记为答案。 如果其他人有更好的方法来做到这一点,请将其评论出来,我会更改它以回答。