Spring Boot 資源配置文件讀取
在實際開發中,我們會遇到關於配置文件的讀取,獲取配置文件的自定義配置,以及如何多環境下的配置文件信息的獲取。
配置讀取優先級
-
命令行參數。
-
從
java:comp/env
得到的 JNDI 屬性。 -
通過
System.getProperties()
獲取的 Java 系統參數。 -
操作系統環境變量。
-
RandomValuePropertySource
配置的random.*
屬性值。如 {random.long}、{random.uuid} 等。 -
JAR 包外部的
application-{profile}.properties
或application.yml
(帶 spring.profile)配置文件。 -
JAR 包內部的
application-{profile}.properties
或application.yml
(帶 spring.profile)配置文件。 -
JAR 包外部的
application.properties
或application.yml
(不帶 spring.profile)配置文件。 -
JAR 包內部的
application.properties
或application.yml
(不帶 spring.profile)配置文件。
(從 JAR 包外向 JAR 包內進行尋找,優先加載帶{profile}
的文件,再加載不帶{profile}
的文件) -
@Configuration
註解類上的@PropertySource
。 -
通過
SpringApplication.setDefaultProperties
指定默認屬性。
注意:application.properties
文件的優先級高於 application.yml
文件的優先級。
配置依賴項
在 pom.xml 文件中,加入 spring-boot-configuration-processor
依賴項,用於讀取配置值。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
屬性配置與實體類的映射
- application.properties
# 32 位隨機字符串
rand.stringValue = ${random.value}
# 隨機的 int 類型數字
rand.intNumber = ${random.int}
# 隨機的 long 類型數字
rand.longNumber = ${random.long}
# 100 以內的隨機int類型
rand.number = ${random.int(100)}
# 0-100 範圍內的隨機int類型
rand.rangeNumber = ${random.int[0,100]}
- author.properties
author.name = yifanzheng
author.nickname = star
author.intro = good boy!
方式一
在 @Configuration
註解的類上加上 @ConfigurationProperties(prefix="前綴名")
註解,可以使用 @PropertySource
註解指定加載的配置文件,不加時默認加載 application.properties
文件
/**
* AuthorConfig
*
* @author star
**/
@Configuration
@ConfigurationProperties(prefix = "author")
@PropertySource(value = "classpath:author.properties") // 指定配置文件的位置
public class AuthorConfig {
private String name;
private String nickname;
private String intro;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
注意:使用這種方式配置的類,在使用 @Autowired 注入時,不能直接 return 注入的對象,它只是指向 Spring 容器中對象資源的一個標識,可以通過這個標識返回該對象中的值。
方式二
使用 @Value
註解,直接映射實體類的各個屬性。
/*
* RandomConfig
*
* @author star
**/
@Component
public class RandomConfig {
@Value("${rand.stringValue}")
private String stringValue;
@Value("${rand.intNumber}")
private Integer intNumber;
@Value("${rand.longNumber}")
private Long longNumber;
@Value("${rand.number}")
private Integer number;
@Value("${rand.rangeNumber}")
private Integer rangeNumber;
public String getStringValue() {
return stringValue;
}
public void setStringValue(String stringValue) {
this.stringValue = stringValue;
}
public Integer getIntNumber() {
return intNumber;
}
public void setIntNumber(Integer intNumber) {
this.intNumber = intNumber;
}
public Long getLongNumber() {
return longNumber;
}
public void setLongNumber(Long longNumber) {
this.longNumber = longNumber;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public Integer getRangeNumber() {
return rangeNumber;
}
public void setRangeNumber(Integer rangeNumber) {
this.rangeNumber = rangeNumber;
}
}
方式三
在方法上使用 @Bean
註解,配合以上註解使用。
/**
* AuthorBeanConfig 使用 @Bean 註解的方式獲取配置信息
*
* @author star
**/
@Configuration
@PropertySource(value = "classpath:author.properties")
public class AuthorBeanConfig {
@Bean
@ConfigurationProperties(prefix = "author")
public AuthorBean getAuthorBean(){
return new AuthorBean();
}
}
在沒有使用 @PropertySource
註解指定加載的文件時,默認使用 application.properties
文件中與實體對象的屬性相同的配置項。
@PropertySources
註解優先級比較低,即使指定了加載的文件,但出現與 application.properties
文件相同的配置項時會被其覆蓋。
自定義 YAML 資源文件屬性配置
- 創建
user.yml
文件,進行屬性配置
# 配置 user 對象的值
demo:
user:
name: star
age: 22
desc: good boy!
- 使用註解標記
User.java
對象文件
/**
* UserConfig
*
* @author star
**/
@Configuration
@ConfigurationProperties(prefix = "demo.user") // 前綴名註釋必須有,不然會報錯
@PropertySource(value = "classpath:user.yml",encoding = "utf-8")
public class User {
// @Value() 註解必須要
@Value("${name}")
private String name;
@Value("${age}")
private int age;
@Value("${desc}")
private String desc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
多環境配置
application-dev.properties
: 開發環境
application-prod.properties
: 生產環境
Spring Boot 通過 application.roperties
文件,設置 spring.profiles.active
屬性加載相應的文件,如:spring.profiles.active=dev
。
注意:Spring Boot 根據環境激活配置文件的規則是,默認加載 application.properties
文件,當此文件配置了 spring.profiles.active=xxx
後,會加載 application-xxx.properties
文件中的配置項,並覆蓋 application.properties
中相同的配置項。
最後
- 使用 YAML 文件時,屬性值和冒號中間必須要有空格。
- YAML 文件在配置中文值時,讀取不會出現亂碼問題;properties 文件配置中文值,讀取會出現亂碼。
因爲 Spring Boot 是以iso-8859-1
的編碼格式讀取 properties 文件。
後記
由於自身能力有限,若有錯誤或者不當之處,還請大家批評指正,一起學習交流!
GitHub 源碼地址:springboot-properties