Spring Boot第二彈,配置文件怎么造?


持續原創輸出,點擊上方藍字關注我吧

前言

自從用了Spring Boot,個人最喜歡的就是Spring Boot的配置文件了,和Spring比起,Spring Boot更加靈活,修改的某些配置也是更加得心應手。

Spring Boot 官方提供了兩種常用的配置文件格式,分別是propertiesYML格式。相比於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是一種新式的格式,層級鮮明,個人比較喜歡使用的一種格式,注意如下:

  1. 字符串可以不加引號,若加雙引號則輸出特殊字符,若不加或加單引號則轉義特殊字符
  2. 數組類型,短橫線后面要有空格;對象類型,冒號后面要有空格
  3. 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注解能夠很輕松的從配置文件中取值,優點如下:

  1. 支持批量的注入屬性,只需要指定一個前綴 prefix
  2. 支持復雜的數據類型,比如 ListMap
  3. 對屬性名匹配的要求較低,比如 user-nameuser_nameuserNameUSER_NAME都可以取值
  4. 支持JAVA的JSR303數據校驗

注意:@ConfigurationProperties這個注解僅僅是支持從Spring Boot的默認配置文件中取值,比如application.propertiesapplication.yml

@Value

@Value這個注解估計很熟悉了,Spring中從屬性取值的注解,支持SPEL表達式,不支持復雜的數據類型,比如List。使用如下:

    @Value("${userinfo.name}")
 private String UserName; 

如何從自定義配置文件中取值?

Spring Boot在啟動的時候會自動加載application.xxxbootsrap.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中的配置文件的語法以及如何從配置文件中取值,這個內容很重要,作者也是盡可能講的通俗易懂,希望讀者能夠有所收獲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM