補習系列(10)-springboot 之配置讀取
簡介
在早前的部落格中曾經寫過 Spring 程式通過 Bean 對映實現配置資訊的讀取。
在SpringBoot 框架中讀取配置的方式變得非常多樣,這導致讀者在搜尋資料時反而容易迷糊。
- 到底,SpringBoot 是按什麼順序載入配置?
- 相應的,我們該選擇什麼樣的方式去讀取?
一、配置樣例
先看一個例子:
@Compoment
public class BuildConfig{
@Value("${buildinfo.version")
private String version;
...
}
程式碼中,@Component 將 BuildConfig 註冊為 Bean ,
接下來使用 @Value 註解,將 配置中的 buildinfo.version鍵對映到了 version 欄位上。
我們都知道,通過 application.properties 可以方便的配置一些屬性。
屬性的值是支援變數替換的,如下:
myName=Lilei
myDesc=${myName} is a good man
這點,是由 SpringBoot 自動生成的 PropertyPlaceholderConfigurer 物件實現的。
除了 上面所說 application.properties 之外,還有什麼途徑?
下面介紹如何注入配置
二、如何注入配置
1. 預設配置檔案
類路徑中 application.properties(yml) 是預設的配置檔案。
此外如果啟動應用時,當前目錄中存在同名的配置檔案,則以此優先。
在此規則之下,SpringBoot 還能識別不同 profile下的配置,這將在後面篇幅中介紹。
2. 使用註解
@PropertySource
可指定屬性配置檔案的位置,
樣例程式碼:
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}
@TestPropertySource
與 @PropertySource 類似,該註解用於指定測試環境中的屬性檔案,其優先順序高於 @PropertySource。
3. 啟動引數
以下的命令以指定引數啟動 SpringBoot 應用
java -jar application.jar --server.port=9000
server.port 值將被注入為環境屬性值。
而以下的命令還可以指定 配置檔案的位置
java -jar application.jar --spring.config.location=/etc/xxx.properties
這個spring.config.location就是指的配置檔案位置,
預設情況下,SpringBoot 會從下面幾路徑找到配置檔案:
路徑 |
---|
file:./config/ |
file:./ |
classpath:/config/ |
classpath:/ |
還有..
SpringBoot 注入配置的方式其實非常多,完整順序如下表:
優先順序 | 配置 |
---|---|
1 | @TestPropertySource 註解 |
2 | @SpringBootTest 註解 |
3 | 命令列引數 |
4 | SPRING_APPLICATION_JSON 屬性值(或環境變數) |
5 | Servlet 相關引數 |
6 | JNDI 屬性 |
7 | Java 系統屬性 (System.getProperties()) |
8 | 作業系統環境變數 |
9 | RandomValuePropertySource 隨機屬性 |
10 | Jar包外部 application-{profile}.properties |
11 | Jar包內部 application-{profile}.properties |
12 | Jar包外部 application.properties |
13 | Jar包內部 application.properties |
14 | @PropertySource 註解 |
15 | SpringApplication 預設值 |
三、如何讀取配置
@Value 註解
如以下的實現:
@Configuration
public class AppConfig {
@Value("${api.log.enabled:false}")
private boolean apiLogEnabled;
除了型別自動轉換之外,通過:false字尾可以指定預設值。
Environment 介面
Environment 是一個類似 Properties 的介面,用來獲取屬性非常方便。
@Configuration
public class AppConfig {
@Autowired
private Environment environment;
public String getApplicationId() {
return this.environment.getProperty("application.id");
}
}
@ConfigurationProperties 註解
該註解一般用作字首匹配,下面的程式碼摘自Mongodb
@ConfigurationProperties(prefix = "spring.data.mongodb")
public class MongoProperties {
/**
* Mongo server host.
*/
private String host;
/**
* Mongo server port.
*/
private Integer port = null;
/**
* Database name.
*/
private String database;
相應的 Mongodb 配置資訊如:
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.database=xxx
四、不同環境中的配置
Spring 提供了 Profile 機制用於管理不同環境的配置。
配置內容可以是 Java Config(對應@Component或@Configuration),也可以是配置檔案。
如:
@Configuration
@Profile("prod")
public class ProdConfiguration {
// ...
}
通過@Profile註解可將程式碼配置關聯到某個配置環境
在具體應用中,Profile的用途通常有二:
1. 區別開發、測試、釋出環境
對於dev、prod、test分別做不同的配置
//for dev
application-dev.properties
//for prod
application-prod.properties
//for test
application-test.properties
可以在 application.properties 指定啟用的環境:
spring.profiles.active=dev
也可以通過命令列指定:
java -jar app.jar --spring.profiles.active=prod
2. 宣告多配置檔案
當內容過多時,可以將配置資訊進行拆分,如下:
application-mongodb.properties
spring.data.mongodb.host=127.0.0.1
spring.data.mongodb.port=27017
spring.data.mongodb.username=xxx
spring.data.mongodb.password=xxx
spring.data.mongodb.database=xxx
application-mail.properties
spring.mail.host=xxx
spring.mail.username=xxx
spring.mail.password=xxx
spring.mail.from=xxx
spring.mail.to=xxx
spring.mail.cc=xxx
在主配置檔案指定包含關係:
application.properties
spring.profiles.include=mongodb,mail
參考文件
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html
歡迎繼續關注"美碼師的補習系列-springboot篇" ,如果覺得老司機的文章還不賴,請多多分享轉發^-^
作者: zale
相關文章
- springboot讀取配置檔案Spring Boot
- SpringBoot系列之YAML配置用法學習筆記Spring BootYAML筆記
- 補習系列(21)-SpringBoot初始化之7招式Spring Boot
- SpringBoot 複雜配置資訊讀取Spring Boot
- SpringBoot配置檔案讀取過程分析Spring Boot
- SpringBoot讀取配置資料的幾種方式Spring Boot
- ASP.NET Core - 配置系統之配置讀取ASP.NET
- 基於oracle 10.2.0.1 rac學習lmon程式系列六之增補一Oracle
- .NET Core 6.0之讀取配置檔案
- springboot 執行 jar 包讀取外部配置檔案Spring BootJAR
- 圖論系列之「讀取圖演算法」圖論演算法
- SpringBoot系列——cache快取Spring Boot快取
- SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置Spring BootTomcat
- 【springboot讀取配置檔案】@ConfigurationProperties、@PropertySource和@ValueSpring Boot
- .NET Core基礎篇之:配置檔案讀取
- SpringBoot系列之資料庫初始化-datasource配置方式Spring Boot資料庫
- 【Dubbo原始碼閱讀系列】之 Dubbo XML 配置載入原始碼XML
- SpringBoot——專案啟動時讀取配置及初始化資源Spring Boot
- viper 讀取配置檔案
- go配置檔案讀取Go
- Spring-讀取配置Spring
- IOC - 讀取配置檔案
- Java系列:讀取XML檔案JavaXML
- jackson學習之九:springboot整合(配置檔案)Spring Boot
- 【SpringBoot2.0系列09】SpringBoot之rabbiSpring Boot
- go學習之檔案讀取問題(需更新)Go
- MATLAB學習之gif圖片讀取顯示Matlab
- springboot2.3.0讀取配置檔案中文亂碼+阿里簡訊服務Spring Boot阿里
- 美團二面:SpringBoot讀取配置優先順序順序是什麼?Spring Boot
- 掌握Mainframe系列之 10分鐘學習COBOLAI
- SpringBoot讀取yml的一個bugSpring Boot
- java中讀取配置檔案Java
- 基於viper的配置讀取
- go 讀取.ini配置檔案Go
- SpringBoot基礎系列之自定義配置源使用姿勢例項演示Spring Boot
- jackson學習之十(終篇):springboot整合(配置類)Spring Boot
- SpringBoot--SpringBoot 讀取Properties檔案(結合JDBC)Spring BootJDBC
- SpringBoot 之配置外部TomcatSpring BootTomcat