springboot如何獲取yaml/yml(或properties)配置文件信息
springboot項(xiàng)目獲取配置文件信息
前言
在分布式項(xiàng)目開發(fā)中,通常會使用配置中心(例如:Apollo 配置中心)將配置文件和項(xiàng)目解耦。
為了更具靈活性,有時(shí)候需要把一些數(shù)據(jù)放在配置文件中獲取,能夠減少很多麻煩,這個(gè)時(shí)候就需要讀取配置文件信息。
本文結(jié)合實(shí)際開發(fā)介紹幾種使用過的讀取配置文件的方法。
首先在配置文件中配置一條數(shù)據(jù):
spring.application.name = user-service
1、@Autowired 注入 Environment類
和項(xiàng)目中注入 service 或者 mapper 一樣,聲明一個(gè) Environment 類變量,加上 @Autowire 注解。
如下:
@Autowired
private Environment environment;該類所屬包:
import org.springframework.core.env.Environment;
代碼獲取配置:
String applicationName = environment.getProperty("spring.application.name");注意:key一定要寫完整,有幾層就寫幾層,每層的名字用點(diǎn)分隔。
但是,使用該方法具有一定的局限性。
局限性1:使用在靜態(tài)方法中
如果要在靜態(tài)方法中讀取配置信息,不能簡單的將 Environment 定義成 static 就完了,由于注入機(jī)制,注入一個(gè)靜態(tài)的 bean 只會得到一個(gè)空的 bean,即變量的值為 null,一旦使用該 bean 對象就會報(bào)空指針異常。
錯(cuò)誤使用方法:
@Autowired
private static Environment environment;//只定義成靜態(tài)變量,environment 只會是null
public static void m1(){
// 一旦使用environment變量就會報(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:無法直接讀取自定義的Yml配置文件
Environment 無法直接讀取自定義的配置文件,需要通過增加一個(gè)配置類,將自定義的配置文件暴露到spring environment 中。
解決方法:
定義一個(gè)配置類,將自定義的配置文件內(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;
/**
* 配置類
* @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;
}
}寫好配置類,就可以通過注解 @Autowired 注入 Environment 類來讀取自定義配置信息了。
2、基礎(chǔ)用法,使用@Value注解直接注入配置信息
使用方式:
@Value(“${xxx.xxx.xxx}”)代碼如下:
@Value("${spring.application.name}")
private String applicationName;注意:該方法也具有上述局限性。
3、進(jìn)階方法(推薦使用)
定義一個(gè)工具類,使用 @Component 注解使其成為配置類,繼承ApplicationRunner 重寫run()方法,再注入 Environment 獲取配置,這樣當(dāng)項(xiàng)目啟動(dòng)好之后,配置的信息就已經(jīng)加載完畢,可以做到在任何地方隨時(shí)隨地獲取配置信息。
代碼如下:
配置類:
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)用工具類的靜態(tài)屬性即可獲取配置信息。
@PostMapping(value = "/test/config")
public List<String> testConfig() {
List<String> list = new ArrayList<String>();
list.add(BaseConfig.applicationName);
return list;
}postman 測試結(jié)果:

拓展:springboot 集成配置中心 - 以 Apollo 為例
微服務(wù)中會使用配置中心管理配置文件信息,springBoot 通常會和這些配置中心集成提供一些方法獲取配置信息,本文以 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è)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一次線上websocket返回400問題排查的實(shí)戰(zhàn)記錄
最近項(xiàng)目中有端對端通信場景,實(shí)時(shí)性要求較高,考慮后選用了websocket 這一通信協(xié)議,下面這篇文章主要給大家介紹了一次線上websocket返回400問題排查的實(shí)戰(zhàn)記錄,需要的朋友可以參考下2022-04-04
Spring Cloud Consul實(shí)現(xiàn)選舉機(jī)制的代碼工程
Spring Cloud Consul 是 Spring Cloud 提供的對 HashiCorp Consul 的支持,它是一種基于服務(wù)網(wǎng)格的工具,用于實(shí)現(xiàn)服務(wù)注冊、發(fā)現(xiàn)、配置管理和健康檢查,本文給大家介紹了如何用Spring Cloud Consul實(shí)現(xiàn)選舉機(jī)制,需要的朋友可以參考下2024-11-11
使用ThreadPoolExecutor之高效處理并發(fā)任務(wù)
這篇文章主要介紹了使用ThreadPoolExecutor之高效處理并發(fā)任務(wù),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
使用java實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲
這篇文章主要介紹了使用java實(shí)現(xiàn)網(wǎng)絡(luò)爬蟲,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Spring boot使用spring retry重試機(jī)制的方法示例
這篇文章主要介紹了Spring boot使用spring retry重試機(jī)制的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Springboot項(xiàng)目刪除項(xiàng)目同步target文件問題解決方案
這篇文章主要介紹了Springboot項(xiàng)目刪除項(xiàng)目同步target文件問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12

