仅通过@Value注入属性映射

时间:2014-08-11 06:04:33

标签: java spring properties

如何使用@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)列表将会很长,并且一行上的所有对将难以阅读和维护。

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

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

2 个答案:

答案 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;
相关问题