SpringBoot讀取yml文件中配置數(shù)組的2種方法
一直都在用Spring的@Value注解讀取yml中的配置,這兩天在讀取配置的時(shí)候,想讀取yml中配置的一個(gè)數(shù)組,通過@Vaule一直獲取不到,通過一番資料的查詢,才徹底清楚了@Vaule的使用情況。
在Spring中讀取配置文件的快捷方法常見的有兩種,一個(gè)是通過@Vaule注解進(jìn)行單一字段的注入,另外一種方法就是通過@ConfigurationProperties注解來進(jìn)行批量注入。
@ConfigurationProperties注解屬于SpringBoot,不在SpringFramework里面
這兩種注入方式各有自己的優(yōu)勢(shì)和使用場(chǎng)景。
@Value | @ConfigurationProperties | |
---|---|---|
使用場(chǎng)景 | 單一屬性注入,注解寫在類的屬性上 | 批量注入,注解寫在類上 |
松散語法 | 不支持 | 支持 |
SpEL | 支持 | 不支持 |
JSR303數(shù)據(jù)校驗(yàn)@Validated | 不支持 | 支持 |
復(fù)雜類型封裝(數(shù)組、Map、對(duì)象等) | 支持 |
其實(shí)@Value可以注入任意類型對(duì)象,數(shù)組、Map、List、自定義對(duì)象等。
可以看我對(duì)@Value的注入過程進(jìn)一步的分析
Spring的@Value可以注入復(fù)雜類型嗎?今天教你通過@value注入自定義類型
yml配置文件:
test: list: - 'a' - 'b' - 'c'
數(shù)組、Map等都輸入復(fù)雜類型封裝,Value注解無法直接讀取。
但是可以通過@ConfigurationProperties注解讀取
通過@ConfigurationProperties注解讀取
這里分為兩種情況
1、讀取的是配置在application.yml文件中的屬性
只需要在類上加上注解就可以,配置好前綴
@Component @ConfigurationProperties(prefix = "test") public class TestYML { private String[] list; public void test(){ System.out.println("list:"+list); } /// set方法不能少 public void setList(String[] list) { this.list = list; } }
2、如果配置是在一個(gè)單獨(dú)的yml文件中
例如 a.yml。那么此時(shí)還應(yīng)該加上一個(gè)@PropertySource注解,指明來自哪個(gè)配置文件和一個(gè)Factory類
@Component @PropertySource(value = {"classpath:a.yml"}, factory = YamlPropertySourceFactory.class) @ConfigurationProperties(prefix = "test") public class TestYML { private String[] list; public void test(){ System.out.println("list:"+list); } /// set方法不能少 public String[] getList() { return list; } }
import org.springframework.boot.env.YamlPropertySourceLoader; import org.springframework.core.env.PropertySource; import org.springframework.core.io.support.DefaultPropertySourceFactory; import org.springframework.core.io.support.EncodedResource; import java.io.IOException; import java.util.List; /** * @author KinYang.Lau * 用于讀取 yml 類型的文件 * @date 2020/9/26 7:06 下午 */ public class YamlPropertySourceFactory extends DefaultPropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException { if (resource == null) { return super.createPropertySource(name, resource); } List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource()); return sources.get(0); } }
同時(shí)還有注意,要有set方法!!!
通過@Value注解變相讀取,曲線救國方案
因?yàn)锧Value注解是支持SpEL表達(dá)式的,所以可以在yml配置文件中,把之前的數(shù)組形式改寫為由字符串形式,例如“a.b.c”
yml文件內(nèi)容
test: list: a.b.c
@Value("#{'${test.list}'.split('.')}") private String[] list2;
這種方法是最簡(jiǎn)單的,不需要單獨(dú)寫一個(gè)類,不用set方法。
如果yml是單獨(dú)的文件的話,只需要在類上添加@PropertySource(value = "classpath:a.yml")注解就行。
注意:
有小伙伴反映,@Value也可以直接注冊(cè)數(shù)組或者結(jié)合。后來我測(cè)試了一下,發(fā)現(xiàn)當(dāng)字符串是以,分割的時(shí)候,就可以注入數(shù)組或者其他集合。 Spring默認(rèn)情況下會(huì)以“,”進(jìn)行分割,轉(zhuǎn)換成對(duì)應(yīng)的數(shù)組或列表。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Sentinel熱門詞匯限流的實(shí)現(xiàn)詳解
這篇文章主要介紹了使用Sentinel對(duì)熱門詞匯進(jìn)行限流的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07深入理解Java虛擬機(jī) JVM 內(nèi)存結(jié)構(gòu)
本節(jié)將會(huì)介紹一下JVM的內(nèi)存結(jié)構(gòu),JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的各個(gè)組成部分:堆,方法區(qū),程序計(jì)數(shù)器,Java虛擬機(jī)棧,本地方法棧,還會(huì)對(duì)Java堆的分代劃分做個(gè)簡(jiǎn)單的介紹2021-09-09阿里規(guī)范:為何boolean類型變量命名禁用is開頭
這篇文章主要給大家介紹了關(guān)于阿里規(guī)范:為何boolean類型變量命名禁用is開頭的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08淺談Java中Unicode的編碼和實(shí)現(xiàn)
這篇文章向大家介紹了Java編程中Unicode編碼及實(shí)現(xiàn)的相關(guān)內(nèi)容,列舉了幾個(gè)字符不同表達(dá)式的比較,以及Unicode平面映射的知識(shí),具有一點(diǎn)點(diǎn)參考價(jià)值,需要的朋友可以了解下。2017-10-10利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù)
這篇文章主要介紹了利用Java代碼實(shí)現(xiàn)區(qū)塊鏈技術(shù),區(qū)塊鏈的應(yīng)用范圍幾乎無窮無盡,關(guān)于區(qū)塊鏈?zhǔn)侨绾芜\(yùn)作的,下文來看看具體的內(nèi)容介紹吧,需要的朋友可以參考一下2022-04-04Java List接口與Iterator接口及foreach循環(huán)使用解析
這篇文章主要介紹了Java List接口與Iterator接口及foreach循環(huán),主要包括List接口與Iterator接口及foreach循環(huán)具體的使用方法和代碼,需要的朋友可以參考下2022-04-04