gpt4 book ai didi

java - 单独通过 @Value 注入(inject)属性映射

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:34 27 4
gpt4 key购买 nike

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

我正在使用 spring boot,它没有任何 XML 文件,我也不想要任何 XML 文件,所以请不要告诉我在 XML 等中声明任何属性读取器 beans .

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

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

我试过声明这个注入(inject):

@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

但不好 - 只是爆炸

Could not autowire field: ... Could not resolve placeholder 'myprop'

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

有没有办法根据多个属性自动构建 map ?

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

最佳答案

不确定这是否完全适用于您的场景(您有一个 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的类(class)正在使用,使用 SPeL 注入(inject):
public class MyBean {

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

public Map getProps() {
return props;
}
}

所以,最后你不用xml(当然),你需要用一个PropertiesFactoryBean加载 .properties 文件并使用 @Value , Spring 将注入(inject) Properties成 map 。额外的代码(可能与 @PropertySource 相比)是 PropertiesFactoryBean并且您不需要手动解析代码中的值(与注入(inject) String[] 的解决方法相比)。

希望这对您有所帮助。

关于java - 单独通过 @Value 注入(inject)属性映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25236748/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com