如何使用@Values
注释填充值映射,如何在applicationContext.xml 或任何其他XML文件中定义任何内容。
我使用的是spring boot,它没有任何 XML文件,也不需要任何XML文件,所以请不要告诉我声明任何属性读者XML等bean。
此外,这是一个属性注入问题 - 请不要建议使用数据库来存储数据 - 这不是一个答案,而且无论如何我都不可能。
此外,我也无法使用YAML(由于部署/运营要求)。
我试过宣布这次注射:
@Value("${myprop}")
Map<Integer, String> map;
这一个
@Value("${myprop.*}")
Map<Integer, String> map;
包含这些条目application.properties
:
myprop.1=One
myprop.2=Two
myprop.3=Three
然后尝试
myprop[1]=One
myprop[2]=Two
myprop[3]=Three
但没有好处 - 只是用
爆炸无法自动装配字段:...无法解决占位符&#39; myprop&#39;
我找到了一个注入String[]
指定为key1:value1,key2:value2,...
的解决方法,然后我会在代码中进行解析,但我不愿意这样做,因为a)它&#39;更多代码,以及b)列表将会很长,并且一行上的所有对将难以阅读和维护。
有没有办法从多个属性自动构建地图?
我不关心属性名称是什么,字段类型或注释是什么;我只想尝试为每个属性注入一个键/值对。
答案 0 :(得分:1)
不确定这是否完全适用于你的场景(你有一个Map<Integer, String>
,但最后你说你只需要一个地图中的键值对),但也许它可以给你一些更多的想法:
@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();
}
}
MyBean
的{{1}}类,使用SPeL注入:Properties
所以,最后你不使用xml(当然),你需要使用public class MyBean {
@Value("#{mapper}")
private Map props;
public Map getProps() {
return props;
}
}
加载.properties文件,使用PropertiesFactoryBean
,Spring会注入{{ 1}}成一张地图。额外的代码(可能与@Value
相比)是Properties
,您无需手动解析代码中的值(与注入@PropertySource
的解决方法相比)
希望这有帮助。
答案 1 :(得分:0)
如何在Java配置中为此定义bean?
@Bean
public Map<Integer, String> myProps(Properties properties) {
Map<Integer, String> map = new HashMap<>();
// implement logic to populate map from properties
return map;
}
在你的班上:
@Autowirded
Map<Integer, String> map;