仅通过@Value注入属性的映射
仅通过@Value注入属性的映射
如何使用@Values
注解填充一个值的映射,而不需要在applicationContext.xml或任何其他XML文件中定义任何内容。我正在使用Spring Boot,它没有任何XML文件,我也不想要任何XML文件,所以请不要告诉我在XML中声明任何属性读取器bean等。
此外,这是一个属性注入的问题 - 请不要建议使用数据库来存储数据 - 这不是一个答案,对于我的情况也不可能。
此外,由于部署/操作要求,我也不能使用YAML。
我尝试声明这个注入:
@Value("${myprop}") Mapmap;
和这个
@Value("${myprop.*}") Mapmap;
使用这些条目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'
我找到了一个解决方法,使用一个注入的String[]
,指定为key1:value1,key2:value2,...
,然后在代码中解析它,但我宁愿不这样做,因为a)这是更多的代码,b)列表将会非常长,并且所有的键值对在一行上很难阅读和维护。
是否有一种自动从多个属性构建映射的方法?
我不关心属性名称是什么,字段类型或注解类型是什么;我只是想每个属性注入一个键/值对。
问题出现的原因:使用@Value注解无法直接将属性文件中的属性注入到Map中。
解决方法:
1. 在Java配置中定义一个bean,用于将属性文件中的属性注入到Map中。
2. 在类中使用Map类型的变量来接收注入的属性。
具体实现如下:
首先,在Java配置类中定义一个方法,用于将属性文件中的属性注入到Map中:
public MapmyProps(Properties properties) { Map map = new HashMap<>(); // 实现从属性文件中将属性注入到map的逻辑 return map; }
然后,在需要使用属性的类中声明一个Map类型的变量来接收注入的属性:
Mapmap;
这样就可以将属性文件中的属性注入到Map中,而不是注入System.getProperties()。
在Spring应用程序中,通过@Value注解注入一个属性的映射时,可能会遇到一个问题。原因是Spring默认情况下无法直接将属性的映射注入到一个Map中。解决这个问题的方法是在application.properties文件中设置属性的值,并使用@Value注解将其注入到一个Map中。
具体的解决方法如下:
1. 在application.properties文件中添加以下内容:
myprop = "{1:'One',2:'Two',3:'Three'}"
这里将属性myprop设置为一个映射,其中键为整数,值为字符串。
2. 在Spring应用程序中的相应位置添加以下代码:
@Value("#{'${myprop}'}") Mapmap;
这里使用@Value注解将属性myprop注入到一个Map
通过以上步骤,就可以实现通过@Value注解将属性的映射注入到一个Map中,解决了这个问题。这样,在Spring应用程序中就可以直接使用这个Map对象来获取属性的值。
问题的出现原因:
在这个问题中,用户需要将.properties文件中的键值对注入到一个Map中。用户尝试使用@Value注解来完成注入,但是并没有成功。
解决方法:
用户可以通过以下步骤来解决这个问题:
1. 创建一个Config类,在该类中加载.properties文件,并将其作为java.util.Properties对象进行处理。
2. 创建一个MyBean类,在该类中使用SPeL注解将Properties对象注入到Map中。
3. 最后,用户不需要使用xml文件,而是需要使用PropertiesFactoryBean来加载.properties文件,并通过@Value注解将Properties对象注入到Map中。
代码如下:
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(); } } public class MyBean { @Value("#{mapper}") private Mapprops; public Map getProps() { return props; } }
通过以上步骤,用户可以成功将.properties文件中的键值对注入到一个Map中,而无需手动解析值。希望这能对你有所帮助。