Spring Boot讀取配置屬性常用方法解析
1. 前言
在Spring Boot項(xiàng)目中我們經(jīng)常需要讀取application.yml配置文件的自定義配置,今天就來(lái)羅列一下從yaml讀取配置文件的一些常用手段和方法。
2. @Value
首先,會(huì)想到使用@Value注解,該注解只能去解析yaml文件中的簡(jiǎn)單類(lèi)型,并綁定到對(duì)象屬性中去。
felord: phone: 182******32 def: name: 碼農(nóng)小胖哥 blog: felord.cn we-chat: MSW_623 dev: name: 碼農(nóng)小胖哥 blog: felord.cn we-chat: MSW_623 type: JUEJIN
對(duì)于上面的yaml配置,如果我們使用@Value注解的話(huà),冒號(hào)后面直接有值的key才能正確注入對(duì)應(yīng)的值。例如felord.phone我們可以通過(guò)@Value獲取,但是felord.def不行,因?yàn)閒elord.def后面沒(méi)有直接的值,它還有下一級(jí)選項(xiàng)。另外@Value不支持yaml松散綁定語(yǔ)法,也就是說(shuō)felord.def.weChat獲取不到felord.def.we-chat的值。
@Value是通過(guò)使用Spring的SpEL表達(dá)式來(lái)獲取對(duì)應(yīng)的值的:
// 獲取 yaml 中 felord.phone的值 并提供默認(rèn)值 UNKNOWN
@Value("${felord.phone:UNKNOWN}")
private String phone;
@Value的使用場(chǎng)景是只需要獲取配置文件中的某項(xiàng)值的情況下,如果我們需要將一個(gè)系列的值進(jìn)行綁定注入就建議使用復(fù)雜對(duì)象的形式進(jìn)行注入了。
3. @ConfigurationProperties
@ConfigurationProperties注解提供了我們將多個(gè)配置選項(xiàng)注入復(fù)雜對(duì)象的能力。它要求我們指定配置的共同前綴。比如我們要綁定felord.def下的所有配置項(xiàng):
package cn.felord.yaml.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import static cn.felord.yaml.properties.FelordDefProperties.PREFIX;
/**
* @author felord.cn
*/
@Data
@ConfigurationProperties(PREFIX)
public class FelordDefProperties {
static final String PREFIX = "felord.def";
private String name;
private String blog;
private String weChat;
}
我們注意到我們可以使用weChat接收we-chat的值,因?yàn)檫@種形式支持從駝峰camel-case到短橫分隔命名kebab-case的自動(dòng)轉(zhuǎn)換。
如果我們使用@ConfigurationProperties的話(huà)建議配置類(lèi)命名后綴為Properties,比如Redis的后綴就是RedisProperties,RabbitMQ的為RabbitProperties。
另外我們?nèi)绻脒M(jìn)行嵌套的話(huà)可以借助于@NestedConfigurationProperty注解實(shí)現(xiàn)。也可以借助于內(nèi)部類(lèi)。這里用內(nèi)部類(lèi)實(shí)現(xiàn)將開(kāi)頭yaml中所有的屬性進(jìn)行注入:
package cn.felord.yaml.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import static cn.felord.yaml.properties.FelordProperties.PREFIX;
/**
* 內(nèi)部類(lèi)和枚舉配置.
*
* @author felord.cn
*/
@Data
@ConfigurationProperties(PREFIX)
public class FelordProperties {
static final String PREFIX = "felord";
private Def def;
private Dev dev;
private Type type;
@Data
public static class Def {
private String name;
private String blog;
private String weChat;
}
@Data
public static class Dev {
private String name;
private String blog;
private String weChat;
}
public enum Type {
JUEJIN,
SF,
OSC,
CSDN
}
}
單獨(dú)使用@ConfigurationProperties的話(huà)依然無(wú)法直接使用配置對(duì)象FelordDefProperties,因?yàn)樗](méi)有被注冊(cè)為Spring Bean。我們可以通過(guò)兩種方式來(lái)使得它生效。
3.1 顯式注入 Spring IoC
你可以使用@Component、@Configuration等注解將FelordDefProperties注入Spring IoC使之生效。
package cn.felord.yaml.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import static cn.felord.yaml.properties.FelordDefProperties.PREFIX;
/**
* 顯式注入Spring IoC
* @author felord.cn
*/
@Data
@Component
@ConfigurationProperties(PREFIX)
public class FelordDefProperties {
static final String PREFIX = "felord.def";
private String name;
private String blog;
private String weChat;
}
3.2 @EnableConfigurationProperties
我們還可以使用注解@EnableConfigurationProperties進(jìn)行注冊(cè),這樣就不需要顯式聲明配置類(lèi)為Spring Bean了。
package cn.felord.yaml.configuration;
import cn.felord.yaml.properties.FelordDevProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* 使用 {@link EnableConfigurationProperties} 注冊(cè) {@link FelordDevProperties}使之生效
* @author felord.cn
*/
@EnableConfigurationProperties({FelordDevProperties.class})
@Configuration
public class FelordConfiguration {
}
該注解需要顯式的注冊(cè)對(duì)應(yīng)的配置類(lèi)。
3.3 @ConfigurationPropertiesScan
在Spring Boot 2.2.0.RELEASE中提供了一個(gè)掃描注解@ConfigurationPropertiesScan。它可以?huà)呙杼囟ò滤械谋籃ConfigurationProperties標(biāo)記的配置類(lèi),并將它們進(jìn)行IoC注入。
package cn.felord.yaml;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
/**
* {@link ConfigurationPropertiesScan} 同 {@link EnableConfigurationProperties} 二選一
*
* @see cn.felord.yaml.configuration.FelordConfiguration
* @author felord.cn
*/
@ConfigurationPropertiesScan
@SpringBootApplication
public class SpringBootYamlApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootYamlApplication.class, args);
}
}
這非常適合自動(dòng)注入和批量注入配置類(lèi)的場(chǎng)景,但是有版本限制,必須在2.2.0及以上。
4. 總結(jié)
日常開(kāi)發(fā)中單個(gè)屬性推薦使用@Value,如果同一組屬性為多個(gè)則推薦@ConfigurationProperties。需要補(bǔ)充一點(diǎn)的是@ConfigurationProperties還支持使用 JSR303 進(jìn)行屬性校驗(yàn)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
非常適合新手學(xué)生的Java線程池優(yōu)化升級(jí)版
作者是一個(gè)來(lái)自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請(qǐng)指正,將來(lái)會(huì)不斷的完善筆記,幫助更多的Java愛(ài)好者入門(mén)2022-03-03
一篇文章帶你搞懂Java restful 接口開(kāi)發(fā)
這篇文章主要介紹了Java restful 接口開(kāi)發(fā)的幾種方式(HTTPS),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-10-10
Graceful Response 構(gòu)建 Spring Boot 響應(yīng)
Graceful Response是一個(gè)Spring Boot技術(shù)棧下的優(yōu)雅響應(yīng)處理器,提供一站式統(tǒng)一返回值封裝、全局異常處理、自定義異常錯(cuò)誤碼等功能,本文介紹Graceful Response 構(gòu)建 Spring Boot 下優(yōu)雅的響應(yīng)處理,感興趣的朋友一起看看吧2024-01-01
Spring攔截器HandlerInterceptor接口代碼解析
這篇文章主要介紹了Spring攔截器HandlerInterceptor接口代碼解析,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12
使用RestTemplate調(diào)用https接口跳過(guò)證書(shū)驗(yàn)證
這篇文章主要介紹了使用RestTemplate調(diào)用https接口跳過(guò)證書(shū)驗(yàn)證,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java線程編程中isAlive()和join()的使用詳解
這篇文章主要介紹了Java線程編程中isAlive()和join()的使用詳解,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09

