Spring Boot第二彈,配置檔案怎麼造?

愛撒謊的男孩發表於2020-09-28

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

前言

自從用了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中的配置檔案的語法以及如何從配置檔案中取值,這個內容很重要,作者也是儘可能講的通俗易懂,希望讀者能夠有所收穫。

相關文章