SpringBoot - 配置文件application.yml使用詳解(附:Profile多環境配置)


1,基本介紹

(1)YAML 是 JSON 的超集,簡潔而強大,是一種專門用來書寫配置文件的語言,可以替代 application.properties。
(2)在創建一個 SpringBoot 項目時,引入的 spring-boot-starter-web 依賴間接地引入了 snakeyaml 依賴, snakeyaml 會實現對 YAML 配置的解析。
(3)YAML 的使用非常簡單,利用縮進來表示層級關系,並且大小寫敏感。

2,YAML 配置與 Properties 配置的比較

  • 可以使用 @PropertySource 注解加載自定義的 Properties 配置文件,但無法加載自定義的 YAML 文件。
  • YAML 支持列表的配置,而 Properties 不支持。

3,常規配置

(1)在 Spring Boot 項目中使用 YAML 只需要在 resources 目錄下創建一個 application .yml 文件即可,這里我們添加如下配置:
有了 application .yml 后我們可以將 resources 目錄下的 application.properties 文件刪除(當然保留也沒問題),完全使用 YAML 完成文件的配置。
注意:application.properties 的優先級會比 application.yml 高,也就是說如果兩個文件都存在,且兩個文件都配置了同一個屬性,那么會以 application.properties 里的配置為准。
server:
  port: 8081
  servlet:
    context-path: /springboot-demo
  tomcat:
    uri-encoding: utf-8

其等效於 application.properties 中的如下配置:

server.port=8081
server.servlet.context-path=/springboot-demo
server.tomcat.uri-encoding=utf-8

(2)配置屬性之間也可以相互引用使用: 

my:
  name: 小明
  age: 25
  info: name:${my.name} age:${my.age}

(3)配置文件中可以使用 ${random} 來生成各種不同類型的隨機值:

my:
  secret: ${random.value}
  number: ${random.int}
  bignumber: ${random.long}
  uuid: ${random.uuid}
  lessthanten: ${random.int(10)}
  numberinrange: ${random.int[1024,65536]}

4,將數據注入到屬性上

(1)假設我們有如下配置數據:

my:
  name: 小明
  age: 25

(2)在需要的地方我們使用 @Value 注解就可以將數據注入到屬性上:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @Value("${my.name}")
    String name;
 
    @GetMapping("/hello")
    public String hello() {
        return "welcome to " + name;
    }
}

5,將數據注入到 Bean 中

有時候屬性太多了,一個個綁定到屬性字段上太累,官方提倡綁定一個對象的 bean。

(1)首先我們創建一個名為 My 的 Bean,並將前面的配置數據注入到這個 Bean 中。

(1)@ConfigurationProperties 中的 prefix 屬性描述了要加載的配置文件的前綴。
(2)Spring Boot 采用了一種寬松的規則來進行屬性綁定:

  • 假設 Bean 中的屬性名為 authorName,那么配置文件中的屬性可以是 my.author_name、my.author-name、my.authorName 或者 my.AUTHORNAME
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
 
@Component
@ConfigurationProperties(prefix = "my")
public class My {
    private String name;
    private String age;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getAge() {
        return age;
    }
 
    public void setAge(String age) {
        this.age = age;
    }
}

6,將數據注入到一個集合中

(1)YAML 還支持列表的配置:

my:
  name: 球
  favorites:
    - 足球
    - 籃球
    - 排球

(2)下面同樣將這組配置注入到 Bean 中,注意到其中 favorites 這個集合數據也自動注入到 List 屬性中:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
 
@Component
@ConfigurationProperties(prefix = "my")
public class My {
    private String name;
 
    private List<String> favorites;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public List<String> getFavorites() {
        return favorites;
    }
 
    public void setFavorites(List<String> favorites) {
        this.favorites = favorites;
    }
}

(3)然后我們在 Controller 中引入這個 Bean 使用即可:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @Autowired
    My my;
 
    @GetMapping("/hello")
    public String hello() {
        return my.getName() + " : " + my.getFavorites();
    }
}

(4)運行結果

7,更復雜的配置:集合里面放置對象

(1)YAML 還支持更復雜的配置,即集合中也可以是一個對象:

my:
  users:
    - name: 小李
      age: 100
    - name: 小劉
      age: 200

(2)下面同樣將這組配置注入到 Bean 中:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
 
@Component
@ConfigurationProperties(prefix = "my")
public class Users {
    private List<User> users;
 
    public List<User> getUsers() {
        return users;
    }
 
    public void setUsers(List<User> users) {
        this.users = users;
    }
}
public class User {
    private String name;
    private String age;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getAge() {
        return age;
    }
 
    public void setAge(String age) {
        this.age = age;
    }
}

(3)然后我們在 Controller 中引入這個 Bean 使用即可:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
 
@RestController
public class HelloController {
    @Autowired
    Users users;
 
    @GetMapping("/hello")
    public String hello() {
        String result = "";
        for (User user : users.getUsers()) {
            result += user.getName() + ":" + user.getAge() + "<br>";
        }
        return result;
    }
}

(4)運行結果

8,使用命令行參數進行配置

(1)在命令行中通過 java -jar 命令啟動項目時,可以使用連續的兩個減號 -- 對 application.yml 中的屬性值進行賦值。
(2)比如下面命令修改 tomcat 端口號為 8081。其等價於在 application.yml 中添加屬性 server.port=8081:
注意:如果 application.yml 中已經有同名屬性,那么命令行屬性會覆蓋 application.yml 的屬性。
java -jar xx.jar --server.port=8081

9,配置文件的優先級

(1)同 application.properties 文件一樣,Spring Boot 項目中的 application.yml 配置文件一共可以出現在如下 4 個位置(優先級逐漸降低):
  • 項目根目錄下的 config 文件夾
  • 項目根目錄下
  • classpath 下的 config 文件夾
  • classpath 下

10,加載外部的配置文件

(1)項目打包好以后,我們可以使用命令行參數的形式,啟動項目的時候來指定外部配置文件的位置。

java -jar xxx.jar --spring.config.location=/Volumes/BOOTCAMP/application.properties

(2)當然我們也可以指定外部配置所在的文件夾,啟動時會搜索並使用該文件夾下的配置文件:

java -jar xxx.jar --spring.config.location=/Volumes/BOOTCAMP/

(3)我們還可以同時配置多個路徑,比如下面樣例先加載外部配置文件,如果不存在外部配置文件的話則使用包內默認的配置文件:

java -jar xxx.jar --spring.config.location=/Volumes/BOOTCAMP/application.properties,classpath:/,classpath:/config/

附:使用 Profile 實現多環境配置

 我們在項目發布之前,一般需要頻繁地在開發環境、測試環境以及生產環境之間進行切換,這個時候大量的配置需要頻繁更改(比如數據庫配置、redis 配置、mongodb 配置等等)。
    Spring Boot 的 Profile 就給我們提供了解決方案,它約定不同環境下的配置文件名稱規則為:
application-{profile}.yml,其中 {profile} 表示當前環境的名稱。

1,創建配置文件 

1)首先在 resources 目錄下創建兩個配置文件:application-dev.yml 和 application-prod.yml 此時,分別表示開發環境中的配置和生產環境中的配置。

 

(2)它們兩個分別設置不同的端口號。
#application-dev.yml
server:
  port: 8080
 
#application-prod.yml
server:
  port: 80

2,在 application.yml 中配置環境

(1)假設我們在 application.yml 中進行如下配置,則表示使用 application-dev.yml 配置文件啟動項目。
spring:
  profiles:
    active: dev

(2)如果將 dev 改為 prod,則表示使用 application-prod.yml 啟動項目。

spring:
  profiles:
    active: prod

(3)項目啟動成功后,就可以通過相應的端口進行訪問了。

3,在代碼中配置環境

(1)除了像前面那樣在 application.yml 中添加配置,我們也可以在代碼中添加配置來完成。
(2)比如我們在啟動類的 main 方法上添加如下代碼,表示使用 application-dev.yml 配置文件啟動項目。
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
 
@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
        SpringApplicationBuilder builder = new
                SpringApplicationBuilder(DemoApplication.class);
        builder.application().setAdditionalProfiles("dev");
        builder.run(args);
    }
}

4,在項目啟動時配置環境

我們也可以在項目打包成 jar 包后啟動時,在命令行中動態指定當前環境:

java -jar xxx.jar --spring.profiles.active=dev

 

 


免責聲明!

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



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