springboot如何獲取yaml/yml(或properties)配置文件信息
springboot項(xiàng)目獲取配置文件信息
前言
在分布式項(xiàng)目開(kāi)發(fā)中,通常會(huì)使用配置中心(例如:Apollo 配置中心)將配置文件和項(xiàng)目解耦。
為了更具靈活性,有時(shí)候需要把一些數(shù)據(jù)放在配置文件中獲取,能夠減少很多麻煩,這個(gè)時(shí)候就需要讀取配置文件信息。
本文結(jié)合實(shí)際開(kāi)發(fā)介紹幾種使用過(guò)的讀取配置文件的方法。
首先在配置文件中配置一條數(shù)據(jù):
spring.application.name = user-service
1、@Autowired 注入 Environment類(lèi)
和項(xiàng)目中注入 service 或者 mapper 一樣,聲明一個(gè) Environment 類(lèi)變量,加上 @Autowire 注解。
如下:
@Autowired private Environment environment;
該類(lèi)所屬包:
import org.springframework.core.env.Environment;
代碼獲取配置:
String applicationName = environment.getProperty("spring.application.name");
注意:key一定要寫(xiě)完整,有幾層就寫(xiě)幾層,每層的名字用點(diǎn)分隔。
但是,使用該方法具有一定的局限性。
局限性1:使用在靜態(tài)方法中
如果要在靜態(tài)方法中讀取配置信息,不能簡(jiǎn)單的將 Environment 定義成 static 就完了,由于注入機(jī)制,注入一個(gè)靜態(tài)的 bean 只會(huì)得到一個(gè)空的 bean,即變量的值為 null,一旦使用該 bean 對(duì)象就會(huì)報(bào)空指針異常。
錯(cuò)誤使用方法:
@Autowired private static Environment environment;//只定義成靜態(tài)變量,environment 只會(huì)是null public static void m1(){ // 一旦使用environment變量就會(huì)報(bào)空指針異常 String applicationName = environment.getProperty("spring.application.name"); }
正確使用方法:
- 將 Environment 定義成 static 靜態(tài)變量
- 加上 environment 的 getter/setter 方法
- 將@Autowire注解加到set方法上
需要注意的是,只需要 get 方法是靜態(tài)的即可,set 方法不要靜態(tài),否則得到的 environment 還是null。
正確代碼如下:
private static Environment environment; @Autowired public void setEnvironment(Environment environment) { this.environment = environment; } public static Environment getEnvironment() { return environment; }
局限性2:無(wú)法直接讀取自定義的Yml配置文件
Environment 無(wú)法直接讀取自定義的配置文件,需要通過(guò)增加一個(gè)配置類(lèi),將自定義的配置文件暴露到spring environment 中。
解決方法:
定義一個(gè)配置類(lèi),將自定義的配置文件內(nèi)容加載到 Environment 中,代碼如下:
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Component; /** * 配置類(lèi) * @Description 讀取自定義Yml格式配置文件 */ @Component public class JdbcConfig { @Bean public PropertySourcesPlaceholderConfigurer getSqlConfigurer() { PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); YamlPropertiesFactoryBean sqlConfigBean = new YamlPropertiesFactoryBean(); sqlConfigBean.setResources(new ClassPathResource("jdbc-properties.yml")); configurer.setProperties(sqlConfigBean.getObject()); return configurer; } }
寫(xiě)好配置類(lèi),就可以通過(guò)注解 @Autowired 注入 Environment 類(lèi)來(lái)讀取自定義配置信息了。
2、基礎(chǔ)用法,使用@Value注解直接注入配置信息
使用方式:
@Value(“${xxx.xxx.xxx}”)
代碼如下:
@Value("${spring.application.name}") private String applicationName;
注意:該方法也具有上述局限性。
3、進(jìn)階方法(推薦使用)
定義一個(gè)工具類(lèi),使用 @Component 注解使其成為配置類(lèi),繼承ApplicationRunner 重寫(xiě)run()方法,再注入 Environment 獲取配置,這樣當(dāng)項(xiàng)目啟動(dòng)好之后,配置的信息就已經(jīng)加載完畢,可以做到在任何地方隨時(shí)隨地獲取配置信息。
代碼如下:
配置類(lèi):
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; @Component public class BaseConfig implements ApplicationRunner { @Autowired private Environment environment; public static String applicationName; @Override public void run(ApplicationArguments args) throws Exception { applicationName = environment.getProperty("spring.application.name"); } }
使用:直接用調(diào)用工具類(lèi)的靜態(tài)屬性即可獲取配置信息。
@PostMapping(value = "/test/config") public List<String> testConfig() { List<String> list = new ArrayList<String>(); list.add(BaseConfig.applicationName); return list; }
postman 測(cè)試結(jié)果:
拓展:springboot 集成配置中心 - 以 Apollo 為例
微服務(wù)中會(huì)使用配置中心管理配置文件信息,springBoot 通常會(huì)和這些配置中心集成提供一些方法獲取配置信息,本文以 Apollo 配置中心為例展示如何獲取配置信息。
- (1)添加依賴
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>red-apollo-client</artifactId> </dependency>
- (2)代碼使用
Config config = ConfigService.getAppConfig();// 連接到 ConfigService 的 DEV/SIT/UAT/PROD 等環(huán)境 String applicationName = config.getProperty("spring.application.name", ""); // 獲取配置信息
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot如何配置文件properties和yml
- SpringBoot中application.properties、application.yaml、application.yml區(qū)別
- springboot之Duration(java.time.Duration)在yml properties中的配置方式
- SpringBoot中application.properties與application.yml區(qū)別小結(jié)
- SpringBoot的配置文件(properties與yml)使用方法
- SpringBoot中properties,yml,yaml的區(qū)別及使用說(shuō)明
相關(guān)文章
從HelloWorld和文檔注釋開(kāi)始入門(mén)Java編程
這篇文章主要介紹了從HelloWorld和文檔注釋開(kāi)始入門(mén)Java編程,涉及到Javadoc工具的使用,需要的朋友可以參考下2015-10-10IDEA的Terminal無(wú)法執(zhí)行g(shù)it命令問(wèn)題
這篇文章主要介紹了IDEA的Terminal無(wú)法執(zhí)行g(shù)it命令問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09SpringBoot結(jié)合Redis配置工具類(lèi)實(shí)現(xiàn)動(dòng)態(tài)切換庫(kù)
本文主要介紹了SpringBoot結(jié)合Redis配置工具類(lèi)實(shí)現(xiàn)動(dòng)態(tài)切換庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08springboot整合JavaCV實(shí)現(xiàn)視頻截取第N幀并保存圖片
這篇文章主要為大家詳細(xì)介紹了springboot如何整合JavaCV實(shí)現(xiàn)視頻截取第N幀并保存為圖片,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-08-08Spring整合Kaptcha谷歌驗(yàn)證碼工具的開(kāi)發(fā)步驟
這篇文章主要介紹了Spring整合Kaptcha谷歌驗(yàn)證碼工具的開(kāi)發(fā)步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01springboot jpa分庫(kù)分表項(xiàng)目實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了springboot jpa分庫(kù)分表項(xiàng)目實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01SpringBoot監(jiān)聽(tīng)事件和處理事件程序示例詳解
這篇文章主要介紹了SpringBoot監(jiān)聽(tīng)事件和處理事件程序示例,監(jiān)聽(tīng)和處理事件是一種常用的模式,用于在應(yīng)用程序的不同部分之間傳遞信息,Spring 的事件發(fā)布/訂閱模型允許我們創(chuàng)建自定義事件,并在這些事件發(fā)生時(shí)由注冊(cè)的監(jiān)聽(tīng)器進(jìn)行處理,需要的朋友可以參考下2022-06-06MyBatis中調(diào)用存儲(chǔ)過(guò)程和函數(shù)的實(shí)現(xiàn)示例
在MyBatis中調(diào)用存儲(chǔ)過(guò)程和函數(shù)是一個(gè)相對(duì)高級(jí)的特性,本文主要介紹了MyBatis中調(diào)用存儲(chǔ)過(guò)程和函數(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07