仅通过@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;