如何更優(yōu)雅地獲取spring boot yml中的值
前言
偶然看到國(guó)外論壇有人在吐槽同事從配置文件獲取值的方式,因此查閱了相關(guān)資料發(fā)現(xiàn)確實(shí)有更便于管理更優(yōu)雅的獲取方式。
github demo地址: springboot-yml-value
1.什么是yml文件
application.yml取代application.properties,用來(lái)配置數(shù)據(jù)可讀性更強(qiáng),尤其是當(dāng)我們已經(jīng)制定了很多的層次結(jié)構(gòu)配置的時(shí)候。
下面是一個(gè)非?;镜膟ml文件:
server: url: http://localhost myapp: name: MyApplication threadCount: 4 ...
等同于以下的application.properties文件:
server.url=http://localhost server.myapp.name=MyApplication server.myapp.threadCount=4 ...
demo中的yml文件如下:
server: url: http://myapp.org app: name: MyApplication threadCount: 10 users: - Jacob - James
2.yml屬性獲取配置
訪問(wèn)yml屬性的一種方法是使用@Value("$ {property}")注釋,但是隨著配置樹(shù)形結(jié)構(gòu)以及數(shù)量的增加,代碼可讀性也隨之降低,更不利于bean的管理。筆者發(fā)現(xiàn)另一種優(yōu)雅的方法可以確保強(qiáng)類型bean的管理以及更方便的驗(yàn)證我們的程序配置。
為了實(shí)現(xiàn)這一點(diǎn),我們將創(chuàng)建一個(gè)@ConfigurationProperties類ServerProperties,它映射一組相關(guān)的屬性:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.ArrayList;
import java.util.List;
/**
* @program: simple-demo
* @description: 映射屬性 (server節(jié)點(diǎn))
* @author: CaoTing
* @date: 2019/6/3
**/
@Data
@ConfigurationProperties("server")
public class ServerProperties {
private String url;
private final App app = new App();
public App getApp() {
return app;
}
public static class App {
private String name;
private String threadCount;
private List<String> users = new ArrayList<>();
// TODO getter and setter
}
}
請(qǐng)注意,我們可以創(chuàng)建一個(gè)或多個(gè)@ConfigurationProperties類。
定義我們的springboot 注冊(cè)配置類ApplicationConfig:
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @program: simple-demo
* @description: 注冊(cè)所有映射屬性類 { }中用逗號(hào)分隔即可注冊(cè)多個(gè)屬性類
* @author: CaoTing
* @date: 2019/6/3
**/
@Configuration
@EnableConfigurationProperties({ServerProperties.class})
public class ApplicationConfig {
}
這里已經(jīng)提到了要在@EnableConfigurationProperties中注冊(cè)的屬性類列表。
3.訪問(wèn)yml屬性
現(xiàn)在可以通過(guò)使用創(chuàng)建的@ConfigurationProperties bean來(lái)訪問(wèn)yml屬性。可以像任何常規(guī)的Spring bean一樣注入這些屬性bean,測(cè)試類如下:
import com.caotinging.ymldemo.application.YmlValueApplication;
import com.caotinging.ymldemo.config.ServerProperties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @program: simple-demo
* @description: 單元測(cè)試類
* @author: CaoTing
* @date: 2019/6/3
**/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = YmlValueApplication.class)
public class AppYmlValueTest {
@Autowired
private ServerProperties config;
@Test
public void printConfigs() {
System.out.println(this.config.getUrl());
System.out.println(this.config.getApp().getName());
System.out.println(this.config.getApp().getThreadCount());
System.out.println(this.config.getApp().getUsers());
}
}
測(cè)試結(jié)果如下:

4.總結(jié)
歡迎移步github上手測(cè)試哦,地址在文首。有幫助的話點(diǎn)個(gè)贊吧,筆芯。轉(zhuǎn)載需附上原文鏈接。
5.補(bǔ)充
因?yàn)橛行』锇椴惶宄唧w用途。筆者補(bǔ)充一下兩者的優(yōu)缺點(diǎn)吧。
Spring Boot通過(guò)ConfigurationProperties注解從配置文件中獲取屬性。從上面的例子可以看出ConfigurationProperties注解可以通過(guò)設(shè)置prefix指定需要批量導(dǎo)入的數(shù)據(jù)。支持獲取字面值,集合,Map,對(duì)象等復(fù)雜數(shù)據(jù)。ConfigurationProperties注解還有其他特點(diǎn)呢?它和Spring的Value注解又有什么區(qū)別呢?
一)ConfigurationProperties和@Value優(yōu)缺點(diǎn)
ConfigurationProperties注解的優(yōu)缺點(diǎn)
一、可以從配置文件中批量注入屬性;
二、支持獲取復(fù)雜的數(shù)據(jù)類型;
三、對(duì)屬性名匹配的要求較低,比如user-name,user_name,userName,USER_NAME都可以取值;
四、支持JAVA的JSR303數(shù)據(jù)校驗(yàn);
五、缺點(diǎn)是不支持SpEL表達(dá)式;
六、確保強(qiáng)類型bean的管理,更方便的驗(yàn)證程序配置;
Value注解的優(yōu)缺點(diǎn)正好相反,它只能一個(gè)個(gè)配置注入值;不支持?jǐn)?shù)組、集合等復(fù)雜的數(shù)據(jù)類型;不支持?jǐn)?shù)據(jù)校驗(yàn);對(duì)屬性名匹配有嚴(yán)格的要求。最大的特點(diǎn)是支持SpEL表達(dá)式,使其擁有更豐富的功能。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
淺談springMVC接收前端json數(shù)據(jù)的總結(jié)
下面小編就為大家分享一篇淺談springMVC接收前端json數(shù)據(jù)的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
SpringBoot項(xiàng)目實(shí)現(xiàn)分布式日志鏈路追蹤
這篇文章主要給大家介紹了Spring Boot項(xiàng)目如何實(shí)現(xiàn)分布式日志鏈路追蹤,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
SpringBoot使用FFmpeg實(shí)現(xiàn)M3U8切片轉(zhuǎn)碼播放
FFmpeg是一個(gè)開(kāi)源跨平臺(tái)的多媒體處理工具套件,它支持音頻、視頻文件的編碼、解碼、流媒體傳輸以及轉(zhuǎn)換等多種操作,本文小編給大家介紹了SpringBoot使用FFmpeg實(shí)現(xiàn)M3U8切片轉(zhuǎn)碼播放的操作,需要的朋友可以參考下2024-08-08
SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法
本篇文章主要介紹了SpringBoot 實(shí)戰(zhàn) 之 優(yōu)雅終止服務(wù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
SpringCloud項(xiàng)目中Feign組件添加請(qǐng)求頭所遇到的坑及解決
這篇文章主要介紹了SpringCloud項(xiàng)目中Feign組件添加請(qǐng)求頭所遇到的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Java簡(jiǎn)化復(fù)雜系統(tǒng)調(diào)用的門(mén)面設(shè)計(jì)模式
Java門(mén)面模式是一種結(jié)構(gòu)性設(shè)計(jì)模式,它為復(fù)雜系統(tǒng)提供了一個(gè)簡(jiǎn)單的接口,使得系統(tǒng)的客戶端能夠更加方便地使用系統(tǒng)功能。門(mén)面模式通過(guò)封裝復(fù)雜的子系統(tǒng),隱藏系統(tǒng)的實(shí)現(xiàn)細(xì)節(jié),提高了系統(tǒng)的易用性和靈活性2023-04-04
Java實(shí)現(xiàn)Twitter的分布式自增ID算法snowflake
這篇文章主要介紹了Java實(shí)現(xiàn)Twitter的分布式自增ID算法snowflake,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
面試必時(shí)必問(wèn)的JVM 類加載機(jī)制詳解
這篇文章主要介紹了一文讀懂Jvm類加載機(jī)制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-08-08

