将动态属性映射读入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; } } 

这是一个典型的环境问题。

有两种方法可以做到这一点:

  1. 在相应的.properties文件末尾添加环境字符串; 在启动时将该值传递给应用程序,让Spring选择正确的值。
  2. 将这些动态属性放在数据库中并在启动时查询它们。 数据库的JNDI将选择正确的值。

我没有找到解决此问题的理想方法,将动态地图属性读入弹簧配置信息。 使用DB也不是我们的选择。 这是我发现的最佳选择:

  • 在属性文件中使用映射键/值对的标准格式,例如:key1 | val1,key2 | val2,key3 | val3,…,keyn | VALN

  • 将此读取到配置bean中的String属性或List属性,如下所示: 使用String to List

  • 让注入java类将项目拆分为setter中的map。

我打算将此标记为答案。 如果其他人有更好的方法来做到这一点,请将其评论出来,我会更改它以回答。