仅通过@Value注入属性映射

如何使用@Values注释填充值映射, 而无需在applicationContext.xml或任何其他XML文件中定义任何内容

我使用的是spring boot,它没有任何 XML文件,也不需要任何XML文件,所以请不要告诉我在XML等中声明任何属性读取器bean。

此外,这是一个属性注入问题 – 请不要建议使用数据库来存储数据 – 这不是一个答案,无论如何我的情况不可能。

此外,我也不能使用YAML(由于部署/操作要求)。

我试过宣布这个注射:

 @Value("${myprop}") Map map; 

还有这个

 @Value("${myprop.*}") Map map; 

使用这些条目application.properties

 myprop.1=One myprop.2=Two myprop.3=Three 

然后试了一下

 myprop[1]=One myprop[2]=Two myprop[3]=Three 

但没有好处 – 只是爆炸

无法自动assembly字段:…无法解决占位符’myprop’

我找到了一个解决方案,注入了String[]指定为key1:value1,key2:value2,...然后我在代码中解析,但我宁愿不这样做因为a)它是更多的代码,并且b)列表将会很长,并且一行上的所有对都将难以阅读和维护。

有没有办法从几个属性自动构建地图?

我不关心属性名称是什么,字段类型或注释是什么; 我只是想为每个属性注入一个键/值对。

不确定这是否完全适用于你的场景(你有一个Map但最后你说你只需要一个Map中的一个键值对),但也许它可以给你一些更多的想法:

  • 假设一个@Configuration类,其中.properties文件作为java.util.Properties对象加载:
 @Configuration public class Config { @Bean(name = "mapper") public PropertiesFactoryBean mapper() { PropertiesFactoryBean bean = new PropertiesFactoryBean(); bean.setLocation(new ClassPathResource("META-INF/spring/application.properties")); return bean; } @Bean public MyBean myBean() { return new MyBean(); } } 
  • 使用SPeL注入的MyBean类,其中使用了这些Properties
 public class MyBean { @Value("#{mapper}") private Map props; public Map getProps() { return props; } } 

所以,最后你不使用xml(当然),你需要使用一个PropertiesFactoryBean来加载.properties文件,使用@Value ,Spring会将Properties注入Map。 额外的代码(可能与@PropertySource相比)是PropertiesFactoryBean ,您不需要手动解析代码中的值(与注入String[]解决方法相比)。

希望这可以帮助。

如何在Java配置中为此定义bean?

 @Bean public Map myProps(Properties properties) { Map map = new HashMap<>(); // implement logic to populate map from properties return map; } 

在你的class上:

 @Autowirded Map map;