1. 程式人生 > >Spring Boot 屬性配置檔案詳解

Spring Boot 屬性配置檔案詳解

SpringBoot 配置檔案預設為application.properties,但現在的趨勢是使用yaml,它是類似於標準通用標記語言的子集XML的資料描述語言,語法比XML簡單很多。application.properties  檔案和 application.yaml 檔案的區別後續詳解~

一、自定義屬性與載入

    把專案中的配置檔案application.properties改成application.yaml

  • application.yaml
test:
    user:
        username : zhangsan
        age : 18
        toString: the age of ${test.user.username} is ${test.user.age}
  • 屬性類:PropertiesConfig
package com.springboot.testone.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class PropertiesConfig {

    //通過@Value("${屬性名}")註解來載入對應的配置屬性
    @Value("${test.user.username}")
    private String username;

    @Value("${test.user.age}")
    private String age;

    @Value("${test.user.toString}")
    private String toString;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getToString() {
        return toString;
    }

    public void setToString(String toString) {
        this.toString = toString;
    }
}
  • 測試Controller
package com.springboot.testone.controller;

import com.springboot.testone.bean.PropertiesConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableAutoConfiguration
public class HelloController {

    @Autowired
    private PropertiesConfig propertiesConfig;

    @RequestMapping(value = "/test",method = RequestMethod.GET)
    public String hello() {
        //return "hello,this is a springboot demo";

        //return propertiesConfig.getUsername() + ":" + propertiesConfig.getAge();
        return propertiesConfig.getToString();
    }
}

二、自定義屬性注入bean

  • 將上面application.yml檔案中的test.user注入到User物件裡,注意這裡的prefix指定的是test.user,對應配置檔案中的結構
package com.springboot.testone.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "test.user")
public class User {

    private String username;

    private int age;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
  •  測試Controller
    @Autowired
    private User user;

    @RequestMapping(value = "/test2", method = RequestMethod.GET)
    public String test2(){
        return user.getUsername() + ":" + user.getAge();
    }

三、自定義額外的配置檔案

    假如我們不想把有些配置配置在application.yaml/properties中。新建其他配置檔案:比如新建test.yaml檔案。配置內容如上面的application.yml一樣。那麼我們注入物件時,應該這麼寫

@Configuration
@PropertySource(value = "classpath:test.yml")
@ConfigurationProperties(prefix = "test.user")

四、多個環境配置檔案

    在現實的開發環境中,我們需要不同的配置環境;格式為application-{profile}.properties,其中{profile}對應你的環境標識,比如:

  • application-test.properties:測試環境
  • application-dev.properties:開發環境
  • application-prod.properties:生產環境

怎麼使用?只需要我們在application.yml中加:

spring:
    profiles:
        active: dev

因為主入口都是application.yaml,這裡指定配置檔案為dev,即啟用application-dev.yaml檔案

server:
    port: 8888
啟動工程,發現程式的埠不再是8080,而是8888,表示開發環境配置成功。

五、官方支援預設配置檔案屬性

六、配置檔案優先順序

  1. 當前目錄下的一個/config子目錄
  2. 當前目錄
  3. 一個classpath下的/config包
  4. classpath根路徑(root)

#注意# 如果我們有多個配置檔案,優先順序高的配置檔案中存在和優先順序低的配置檔案相同屬性時,取優先順序高配置檔案的,不衝突的時候,優先順序低的配置檔案屬性同樣會被載入,而不是隻載入優先順序高的配置檔案屬性。