在Spring-Boot中如何使用@Value注解注入集合類
我們在使用spring框架進(jìn)行開發(fā)時,有時候需要在properties文件中配置集合內(nèi)容并注入到代碼中使用。本篇文章的目的就是給出一種可行的方式。
1.注入
通常來說,我們都使用@Value注解來注入properties文件中的內(nèi)容,注入集合類時,我們也使用@Value來注入。
properties文件中的內(nèi)容如下:
my.set=foo,bar
my.list=foo,bar
my.map={"foo": "bar"}
分別是我們要注入的Set,List,Map中的內(nèi)容。
注入方式如下:
@Value("#{${my.map}}")
private Map<String, String> map;
@Value("#{'${my.set}'}")
private Set<String> set;
@Value("#{'${my.list}'}")
private List<String> list;
2.驗(yàn)證
我們寫一個單測類來驗(yàn)證上面的注入是否可行。
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,
classes = PropertiesTest.ClassUsingProperties.class)
@TestPropertySource(locations = "classpath:test.properties")
public class PropertiesTest {
@Autowired
private ClassUsingProperties classUsingProperties;
@Test
public void testInjectCollectionFieldsUsingPropertiesFile() {
Map<String, String> map = classUsingProperties.getMap();
Set<String> set = classUsingProperties.getSet();
List<String> list = classUsingProperties.getList();
asserts(map, set, list);
}
private void asserts(Map<String, String> map, Set<String> set, List<String> list) {
Assert.assertEquals(map.get("foo"), "bar");
Assert.assertTrue(set.contains("foo"));
Assert.assertTrue(set.contains("bar"));
Assert.assertTrue(list.contains("foo"));
Assert.assertTrue(list.contains("bar"));
}
@Data
@Component
public static class ClassUsingProperties {
@Value("#{${my.map}}")
private Map<String, String> map;
@Value("#{'${my.set}'}")
private Set<String> set;
@Value("#{'${my.list}'}")
private List<String> list;
}
}
test.properties中的內(nèi)容已經(jīng)在上面給出,位置在test文件夾下的resources文件夾下面(maven項(xiàng)目的文件夾結(jié)構(gòu))。
3.原理
在我們使用的@Value注解中,每一個開頭都有個#,這其實(shí)就是說明我們使用了SpEL,如果直接使用SpEL,
就是下面的代碼:
ExpressionParser parser = new SpelExpressionParser();
Map<String, String> map =
(Map<String, String>) parser
.parseExpression({'foo':'bar'}")
.getValue(Map.class);
Set<String> set =
(Set<String>) parser
.parseExpression("'foo,bar'")
.getValue(Set.class);
List<String> list =
(List<String>) parser
.parseExpression("'foo,bar'")
.getValue(List.class);
我們也使用單元測試來驗(yàn)證:
@Test
@SuppressWarnings("unchecked")
public void testInitCollectionUsingSpEL() {
ExpressionParser parser = new SpelExpressionParser();
Map<String, String> map =
(Map<String, String>) parser
.parseExpression("{'foo':'bar'}")
.getValue(Map.class);
Set<String> set =
(Set<String>) parser
.parseExpression("'foo,bar'")
.getValue(Set.class);
List<String> list =
(List<String>) parser
.parseExpression("'foo,bar'")
.getValue(List.class);
asserts(map, set, list);
}
asserts方法的代碼已經(jīng)在驗(yàn)證使用@Value注解方式的單元測試中給出。
4.總結(jié)
我們用@Value注解把properties文件中的內(nèi)容注入了集合類,注解中以#開頭,其實(shí)就是使用了SpEL。
Spring-Boot的版本是2.2.1.RELEASE,之所以要說這個,是因?yàn)橐婚_始使用1.x版本時無法注入Set和List。
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Boot Security 結(jié)合 JWT 實(shí)現(xiàn)無狀態(tài)的分布式API接口
JSON Web Token(縮寫 JWT)是目前最流行的跨域認(rèn)證解決方案。這篇文章主要介紹了Spring Boot Security 結(jié)合 JWT 實(shí)現(xiàn)無狀態(tài)的分布式API接口 ,需要的朋友可以參考下2019-04-04
jpa?EntityManager?復(fù)雜查詢實(shí)例
這篇文章主要介紹了jpa?EntityManager?復(fù)雜查詢實(shí)例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
JDK1.8下載、安裝和環(huán)境配置超詳細(xì)教程(最新最完整)
jdk1.8是一款功能強(qiáng)大的Java語音軟件開發(fā)工具包,JDK是學(xué)好Java的第一步,本文重點(diǎn)給大家介紹JDK1.8下載、安裝和環(huán)境配置教程,需要的朋友可以參考下2022-11-11
關(guān)于JDK15的新特性之TextBlocks文本塊的引入和使用
這篇文章主要介紹了關(guān)于JDK15的新特性之文本塊的引入和使用,如果具有一種語言學(xué)機(jī)制,可以比多行文字更直觀地表示字符串,而且可以跨越多行,而且不會出現(xiàn)轉(zhuǎn)義的視覺混亂,那么這將提高廣泛Java類程序的可讀性和可寫性,需要的朋友可以參考下2023-07-07
SpringBoot2使用Jetty容器操作(替換默認(rèn)Tomcat)
這篇文章主要介紹了SpringBoot2使用Jetty容器操作(替換默認(rèn)Tomcat),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10
SpringCloud Netflix Ribbon源碼解析(推薦)
這篇文章主要介紹了SpringCloud Netflix Ribbon源碼解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
Java程序去調(diào)用并執(zhí)行shell腳本及問題總結(jié)(推薦)
這篇文章主要介紹了Java程序去調(diào)用并執(zhí)行shell腳本及問題總結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06

