为了解释Spring中@Value
读取properties
作为Map
或List
的操作,我们需要先了解@Value
的基本用法。
@Value
是Spring框架提供的一个注解,可以用于为类中的属性注入值。它有两种形式:
@Value("value")
@Value("#{expression}")
第一种形式支持直接赋值,第二种形式可以使用SpEL表达式来计算。两种形式都可以读取properties
文件中的值。
假设我们有一个properties
文件:
server.port=8080
server.context=/myapp
my.list=one,two,three
my.map.key1=value1
my.map.key2=value2
接下来,我们可以使用@Value
注解来读取这个properties
文件。
将属性值作为字符串
如果我们只需要将属性值作为字符串读取,可以直接使用@Value
注解读取属性值。例如:
@Component
public class MyComponent {
@Value("${server.port}")
private String serverPort;
public void printServerPort() {
System.out.println(serverPort);
}
}
在上面的示例中,我们将${server.port}
作为参数传递给了@Value
注解。Spring会自动读取properties
文件中的值,并将其注入到serverPort
属性中。
另外,可以使用${}
语法来读取properties
文件中的值。其中,${}
中的字符串是要读取的属性名。
将属性值作为List
如果我们需要将一个属性值作为List
读取,可以使用@Value
注解的第二种形式。例如:
@Component
public class MyComponent {
@Value("#{'${my.list}'.split(',')}")
private List<String> myList;
public void printList() {
System.out.println(myList);
}
}
在上面的示例中,我们使用${my.list}
从properties
文件中读取一个字符串。接着,在SpEL表达式中,我们通过split(',')
将字符串分割成一个List
。最后,将该List
注入到了myList
属性中。
注:在
@Value
注解中使用表达式时,需要将表达式用花括号括起来,并且在表达式前面加上井号符号#
。
将属性值作为Map
如果我们需要将一个属性值作为Map
读取,可以使用@Value
注解的第二种形式,并将返回值转换为Map
。例如:
@Component
public class MyComponent {
@Value("#{${my.map}}")
private Map<String, String> myMap;
public void printMap() {
System.out.println(myMap);
}
}
在上面的示例中,我们使用${my.map}
从properties
文件中读取一个Map
。在SpEL表达式中,我们将该Map
直接返回。最后,将该Map
注入到了myMap
属性中。
注:在
@Value
注解中使用表达式时,使用#{}
将表达式包裹,并将属性值作为表达式返回值。
示例1
@Value("#{${testMap}}")
Map<String,String> testMap;
@Test
public void contextLoads() {
testMap.keySet().forEach(key -> {
System.out.println(key+":"+testMap.get(key));
});
}
我们定义了一个testMap,读取下面这段配置
testMap={key1:'value1',key2:'value2',key3:'value3'}
我们的程序输出如下
key2:value2
key3:value3
key1:value1
我们获取到了一个三个元素的Map,并且Map的顺序与properties中的不一样。这是由于在properties中,键值对是无序的。如果要获取有序的Map,可以使用LinkedHashMap
示例2
@Value("#{'${testList}'.split(',')}")
List<String> testList;
@Test
public void contextLoads() {
System.out.println(testList);
}
我们读取了下面这个配置:
testList=apple,banana,orange
通过使用.split(',')
,我们将字符串转换为了一个List,输出的内容为
[apple, banana, orange]
以上两个示例都是通过先读取properties
文件的键值对,再使用@Value
注解将值注入到我们的类中,从而在代码中使用读取到的值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring中@Value读取properties作为map或list的操作 - Python技术站