首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >仅通过@Value注入一个属性映射

仅通过@Value注入一个属性映射
EN

Stack Overflow用户
提问于 2014-08-10 22:04:32
回答 2查看 3K关注 0票数 3

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

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

另外,这是一个属性注入问题--请不要建议使用数据库来存储数据--这不是一个答案,对我的情况也是不可能的。

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

我试着宣布注射:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value("${myprop}")
Map<Integer, String> map;

而这个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Value("${myprop.*}")
Map<Integer, String> map;

使用这些条目application.properties

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myprop.1=One
myprop.2=Two
myprop.3=Three

然后试着

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myprop[1]=One
myprop[2]=Two
myprop[3]=Three

但没什么好的-只是用

无法自动定位:.无法解析占位符“我的道具”

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

是否有一种方法可以从多个属性自动构建映射?

我不在乎属性名是什么,字段类型或注释是什么;我只是尝试在每个属性中注入一个键/值对。

EN

回答 2

Stack Overflow用户

发布于 2014-08-14 01:45:10

不确定这是否完全适用于您的场景(您有一个Map<Integer, String>,但最终您说您只需要在Map中使用一个键值对),但也许它可以给您提供更多的想法:

  • 假设有一个@Configuration类,其中.properties文件作为java.util.Properties对象加载:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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();
    }
}
  • 正在使用这些MyBeanProperties类,使用SPeL注入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyBean {

    @Value("#{mapper}")
    private Map props;

    public Map getProps() {
        return props;
    }
}

因此,最终您不使用xml (当然),您需要使用PropertiesFactoryBean来加载.properties文件,并且使用@Value,Spring将把Properties注入到地图中。额外的代码(可能与@PropertySource相比)是PropertiesFactoryBean,您不需要手动解析代码中的值(与注入String[]的解决方案相比)。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-08-11 00:45:30

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public Map<Integer, String> myProps(Properties properties) {
  Map<Integer, String> map = new HashMap<>();

  // implement logic to populate map from properties

  return map;
}

在你们班:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowirded
Map<Integer, String> map;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25236748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文