Spring Boot第二彈,配置文件怎麼造?
- 2020 年 9 月 28 日
- 筆記
- JAVA, springboot, 碼猿技術專欄
持續原創輸出,點擊上方藍字關注我吧

前言
自從用了Spring Boot,個人最喜歡的就是Spring Boot的配置文件了,和Spring比起,Spring Boot更加靈活,修改的某些配置也是更加得心應手。
Spring Boot 官方提供了兩種常用的配置文件格式,分別是properties
、YML
格式。相比於properties
來說,YML
更加年輕,層級也是更加分明。
今天這篇文章就來介紹一下Spring Boot的配置文件的語法以及如何從配置文件中取值。
properties格式簡介
常見的一種配置文件格式,Spring中也是用這種格式,語法結構很簡單,結構為:key=value
。具體如下:
userinfo.name=myjszl
userinfo.age=25
userinfo.active=true
userinfo.created-date=2018/03/31 16:54:30
userinfo.map.k1=v1
userinfo.map.k2=v2
上述配置文件中對應的實體類如下:
@Data
@ToString
public class UserInfo {
private String name;
private Integer age;
private Boolean active;
private Map<String,Object> map;
private Date createdDate;
private List<String> hobbies;
}
結構很簡單,無非就是key=value
這種形式,也是在開發中用的比較多的一種格式。
YML格式簡介
以空格的縮進程度來控制層級關係。空格的個數並不重要,只要左邊空格對齊則視為同一個層級。注意不能用tab
代替空格。且大小寫敏感。支援字面值,對象,數組三種數據結構,也支援複合結構。
字面值:字元串,布爾類型,數值,日期。字元串默認不加引號,單引號會轉義特殊字元。日期格式支援yyyy/MM/dd HH:mm:ss
對象:由鍵值對組成,形如 key:(空格)value 的數據組成。冒號後面的空格是必須要有的,每組鍵值對佔用一行,且縮進的程度要一致,也可以使用行內寫法:{k1: v1, ....kn: vn}
數組:由形如 -(空格)value 的數據組成。短橫線後面的空格是必須要有的,每組數據佔用一行,且縮進的程度要一致,也可以使用行內寫法:[1,2,...n]
複合結構:上面三種數據結構任意組合
如何使用
在src/resources
文件夾下創建一個application.yml
文件。支援的類型主要有字元串,帶特殊字元的字元串,布爾類型,數值,集合,行內集合,行內對象,集合對象這幾種常用的數據格式。
具體的示例如下:
userinfo:
age: 25
name: myjszl
active: true
created-date: 2018/03/31 16:54:30
map: {k1: v1,k2: v2}
hobbies:
- one
- two
- three
上述配置文件對應的實體類如下:
@Data
@ToString
public class UserInfo {
private String name;
private Integer age;
private Boolean active;
private Map<String,Object> map;
private Date createdDate;
private List<String> hobbies;
}
總結
YML是一種新式的格式,層級鮮明,個人比較喜歡使用的一種格式,注意如下:
-
字元串可以不加引號,若加雙引號則輸出特殊字元,若不加或加單引號則轉義特殊字元 -
數組類型,短橫線後面要有空格;對象類型,冒號後面要有空格 -
YAML是以空格縮進的程度來控制層級關係,但不能用tab鍵代替空格,大小寫敏感
如何從配置文件取值?
一切的配置都是為了取值,Spring Boot也是提供了幾種取值的方式,下面一一介紹。
@ConfigurationProperties
這個註解用於從配置文件中取值,支援複雜的數據類型,但是不支援SPEL
表達式。
該註解中有一個屬性prefix
,用於指定獲配置的前綴,畢竟配置文件中的屬性很多,也有很多重名的,必須用一個前綴來區分下。
該註解可以標註在類上也可以標註在方法上,這也註定了它有兩種獲取值的方式。
1. 標註在實體類上
這種方式用於從實體類上取值,並且賦值到對應的屬性。使用如下:
/**
* @Component :注入到IOC容器中
* @ConfigurationProperties:從配置文件中讀取文件
*/
@Component
@ConfigurationProperties(prefix = "userinfo")
@Data
@ToString
public class UserInfo {
private String name;
private Integer age;
private Boolean active;
private Map<String,Object> map;
private Date createdDate;
private List<String> hobbies;
}
標註在配置類中的方法上
標註在配置類上的方法上,同樣是從配置文件中取值賦值到返回值的屬性中。使用如下:
/**
* @Bean : 將返回的結果注入到IOC容器中
* @ConfigurationProperties :從配置文件中取值
* @return
*/
@ConfigurationProperties(prefix = "userinfo")
@Bean
public UserInfo userInfo(){
return new UserInfo();
}
總結
@ConfigurationProperties
註解能夠很輕鬆的從配置文件中取值,優點如下:
-
支援批量的注入屬性,只需要指定一個前綴 prefix
-
支援複雜的數據類型,比如 List
、Map
-
對屬性名匹配的要求較低,比如 user-name
,user_name
,userName
,USER_NAME
都可以取值 -
支援JAVA的JSR303數據校驗
注意:@ConfigurationProperties
這個註解僅僅是支援從Spring Boot的默認配置文件中取值,比如application.properties
、application.yml
。
@Value
@Value
這個註解估計很熟悉了,Spring中從屬性取值的註解,支援SPEL
表達式,不支援複雜的數據類型,比如List
。使用如下:
@Value("${userinfo.name}")
private String UserName;
如何從自定義配置文件中取值?
Spring Boot在啟動的時候會自動載入application.xxx
和bootsrap.xxx
,但是為了區分,有時候需要自定義一個配置文件,那麼如何從自定義的配置文件中取值呢?此時就需要配合@PropertySource
這個註解使用了。
只需要在配置類上標註@PropertySource
並指定你自定義的配置文件即可完成。如下:
@SpringBootApplication
@PropertySource(value = {"classpath:custom.properties"})
public class DemoApplication {
value
屬性是一個數組,可以指定多個配置文件同時引入。
@PropertySource
默認載入xxx.properties
類型的配置文件,不能載入YML
格式的配置文件,怎麼破???
如何載入自定義YML格式的配置文件?
@PropertySource
註解有一個屬性factory
,默認值是PropertySourceFactory.class
,這個就是用來載入properties
格式的配置文件,我們可以自定義一個用來載入YML
格式的配置文件,如下:
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import java.io.IOException;
import java.util.Properties;
public class YmlConfigFactory extends DefaultPropertySourceFactory {
@Override
public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
String sourceName = name != null ? name : resource.getResource().getFilename();
if (!resource.getResource().exists()) {
return new PropertiesPropertySource(sourceName, new Properties());
} else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {
Properties propertiesFromYaml = loadYml(resource);
return new PropertiesPropertySource(sourceName, propertiesFromYaml);
} else {
return super.createPropertySource(name, resource);
}
}
private Properties loadYml(EncodedResource resource) throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
}
}
此時只需要將factory
屬性指定為YmlConfigFactory
即可,如下:
@SpringBootApplication
@PropertySource(value = {"classpath:custom.yml"},factory = YmlConfigFactory.class)
public class DemoApplication {
總結
@PropertySource
指定載入自定義的配置文件,默認只能載入properties
格式,但是可以指定factory
屬性來載入YML
格式的配置文件。
總結
以上內容介紹了Spring Boot中的配置文件的語法以及如何從配置文件中取值,這個內容很重要,作者也是儘可能講的通俗易懂,希望讀者能夠有所收穫。