SpringBoot讀取yml文件中配置數(shù)組的2種方法
一直都在用Spring的@Value注解讀取yml中的配置,這兩天在讀取配置的時候,想讀取yml中配置的一個數(shù)組,通過@Vaule一直獲取不到,通過一番資料的查詢,才徹底清楚了@Vaule的使用情況。
在Spring中讀取配置文件的快捷方法常見的有兩種,一個是通過@Vaule注解進行單一字段的注入,另外一種方法就是通過@ConfigurationProperties注解來進行批量注入。
@ConfigurationProperties注解屬于SpringBoot,不在SpringFramework里面
這兩種注入方式各有自己的優(yōu)勢和使用場景。
@Value | @ConfigurationProperties | |
---|---|---|
使用場景 | 單一屬性注入,注解寫在類的屬性上 | 批量注入,注解寫在類上 |
松散語法 | 不支持 | 支持 |
SpEL | 支持 | 不支持 |
JSR303數(shù)據(jù)校驗@Validated | 不支持 | 支持 |
復雜類型封裝(數(shù)組、Map、對象等) | 支持 |
其實@Value可以注入任意類型對象,數(shù)組、Map、List、自定義對象等。
可以看我對@Value的注入過程進一步的分析
Spring的@Value可以注入復雜類型嗎?今天教你通過@value注入自定義類型
yml配置文件:
test: list: - 'a' - 'b' - 'c'
數(shù)組、Map等都輸入復雜類型封裝,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、如果配置是在一個單獨的yml文件中
例如 a.yml。那么此時還應該加上一個@PropertySource注解,指明來自哪個配置文件和一個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); } }
同時還有注意,要有set方法!!!
通過@Value注解變相讀取,曲線救國方案
因為@Value注解是支持SpEL表達式的,所以可以在yml配置文件中,把之前的數(shù)組形式改寫為由字符串形式,例如“a.b.c”
yml文件內容
test: list: a.b.c
@Value("#{'${test.list}'.split('.')}") private String[] list2;
這種方法是最簡單的,不需要單獨寫一個類,不用set方法。
如果yml是單獨的文件的話,只需要在類上添加@PropertySource(value = "classpath:a.yml")注解就行。
注意:
有小伙伴反映,@Value也可以直接注冊數(shù)組或者結合。后來我測試了一下,發(fā)現(xiàn)當字符串是以,分割的時候,就可以注入數(shù)組或者其他集合。 Spring默認情況下會以“,”進行分割,轉換成對應的數(shù)組或列表。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
阿里規(guī)范:為何boolean類型變量命名禁用is開頭
這篇文章主要給大家介紹了關于阿里規(guī)范:為何boolean類型變量命名禁用is開頭的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08Java List接口與Iterator接口及foreach循環(huán)使用解析
這篇文章主要介紹了Java List接口與Iterator接口及foreach循環(huán),主要包括List接口與Iterator接口及foreach循環(huán)具體的使用方法和代碼,需要的朋友可以參考下2022-04-04