如何使用@Values
注释填充值映射,而无需在applicationContext.xml或任何其他XML文件中定义任何内容。
我使用spring引导,它没有任何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
但没什么好的-只是用
无法自动定位:.无法解析占位符“我的道具”
我找到了一个解决方案,将注入的String[]
指定为key1:value1,key2:value2,...
,然后在代码中进行解析,但我不想这样做,因为( a)代码更多,b)列表很长,一行中的所有对都很难阅读和维护。
是否有一种方法可以从多个属性自动构建映射?
我不在乎属性名是什么,字段类型或注释是什么;我只是尝试在每个属性中注入一个键/值对。
发布于 2014-08-14 01:45:10
不确定这是否完全适用于您的场景(您有一个Map<Integer, String>
,但最终您说您只需要在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();
}
}
MyBean
的Properties
类,使用SPeL注入:public class MyBean {
@Value("#{mapper}")
private Map props;
public Map getProps() {
return props;
}
}
因此,最终您不使用xml (当然),您需要使用PropertiesFactoryBean
来加载.properties文件,并且使用@Value
,Spring将把Properties
注入到地图中。额外的代码(可能与@PropertySource
相比)是PropertiesFactoryBean
,您不需要手动解析代码中的值(与注入String[]
的解决方案相比)。
希望这能有所帮助。
发布于 2014-08-11 00:45:30
在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;
https://stackoverflow.com/questions/25236748
复制相似问题