单独通过 @Value 注入属性映射

2024-01-08

如何使用@Values注解,无需在 applicationContext.xml 中定义任何内容或任何其他 XML 文件。

我使用的是 spring boot,它没有anyXML 文件,我也不想要任何 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

但没有什么好处 - 只是爆炸

无法自动装配字段:...无法解析占位符“myprop”

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

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

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


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

  • 假设一个@Configuration.properties 文件作为 .properties 文件加载的类java.util.Properties object:
@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();
    }
}
  • the 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[]).

希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单独通过 @Value 注入属性映射 的相关文章

随机推荐