Java開發學習(三十六)—-SpringBoot三種配置文件解析

一、 配置文件格式

我們現在啟動伺服器默認的埠號是 8080,訪問路徑可以書寫為

//localhost:8080/books/1

在線上環境我們還是希望將埠號改為 80,這樣在訪問的時候就可以不寫埠號了,如下

//localhost/books/1

SpringBoot 程式如何修改呢?SpringBoot 提供了多種屬性配置方式

  • application.properties

    server.port=80
  • application.yml

    server:
        port: 81
  • application.yaml

    server:
        port: 82

注意:SpringBoot 程式的配置文件名必須是 application ,只是後綴名不同而已。

1.1 環境準備

延用Java開發學習(三十五)—-SpringBoot快速入門及起步依賴解析裡面的環境,結構如下

在該工程中的 com.itheima.controller 包下創建一個名為 BookController 的控制器。內容如下:

@RestController
@RequestMapping("/books")
public class BookController {
​
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("id ==> "+id);
        return "hello , spring boot!";
    }
}

1.2 不同配置文件演示

  • application.properties配置文件

現在需要進行配置,配合文件必須放在 resources 目錄下,而該目錄下有一個名為 application.properties 的配置文件,我們就可以在該配置文件中修改埠號,在該配置文件中書寫 port 。

application.properties 配置文件內容如下:

server.port=80

啟動服務,會在控制台列印出日誌資訊,從日誌資訊中可以看到綁定的埠號已經修改了

  • application.yml配置文件

刪除 application.properties 配置文件中的內容。在 resources 下創建一個名為 application.yml 的配置文件,在該文件中書寫埠號的配置項,格式如下:

server:
    port: 81

注意: 在:後,數據前一定要加空格。

啟動服務,可以在控制台看到綁定的埠號是 81

  • application.yaml配置文件

刪除 application.yml 配置文件和 application.properties 配置文件內容,然後在 resources 下創建名為 application.yaml 的配置文件,配置內容和後綴名為 yml 的配置文件中的內容相同,只是使用了不同的後綴名而已

application.yaml 配置文件內容如下:

server:
    port: 83

啟動服務,在控制台可以看到綁定的埠號

1.3 三種配置文件的優先順序

在三種配合文件中分別配置不同的埠號,啟動服務查看綁定的埠號。用這種方式就可以看到哪個配置文件的優先順序更高一些

application.properties 文件內容如下:

server.port=80

application.yml 文件內容如下:

server:
    port: 81

application.yaml 文件內容如下:

server:
    port: 82

啟動服務,在控制台可以看到使用的埠號是 80。說明 application.properties 的優先順序最高

注釋掉 application.properties 配置文件內容。再次啟動服務,在控制台可以看到使用的埠號是 81,說明 application.yml 配置文件為第二優先順序。

從上述的驗證結果可以確定三種配置文件的優先順序是:

application.properties > application.yml > application.yaml

yml格式一般最常使用

二、yaml格式

上面講了三種不同類型的配置文件,而 properties 類型的配合文件之前我們學習過,接下來我們重點介紹 yaml 類型的配置文件。

YAML(YAML Ain’t Markup Language),一種數據序列化格式。這種格式的配置文件在近些年已經佔有主導地位,那麼這種配置文件和前期使用的配置文件是有一些優勢的,我們先看之前使用的配置文件。

最開始我們使用的是 xml ,格式如下:

<enterprise>
    <name>itcast</name>
    <age>16</age>
    <tel>4006184000</tel>
</enterprise>

properties 類型的配置文件如下

enterprise.name=itcast
enterprise.age=16
enterprise.tel=4006184000

yaml 類型的配置文件內容如下

enterprise:
    name: itcast
    age: 16
    tel: 4006184000

優點:

  • 容易閱讀

    yaml 類型的配置文件比 xml 類型的配置文件更容易閱讀,結構更加清晰

  • 容易與腳本語言交互

  • 以數據為核心,重數據輕格式

    yaml 更注重數據,而 xml 更注重格式

YAML 文件擴展名:

  • .yml (主流)

  • .yaml

上面兩種後綴名都可以,以後使用更多的還是 yml 的。

2.1 語法規則

  • 大小寫敏感

  • 屬性層級關係使用多行描述,每行結尾使用冒號結束

  • 使用縮進表示層級關係,同層級左側對齊,只允許使用空格(不允許使用Tab鍵)

    空格的個數並不重要,只要保證同層級的左側對齊即可。

  • 屬性值前面添加空格(屬性名與屬性值之間使用冒號+空格作為分隔)

  • # 表示注釋

核心規則:數據前面要加空格與冒號隔開

數組數據在數據書寫位置的下方使用減號作為數據開始符號,每行書寫一個數據,減號與數據間空格分隔,例如

enterprise:
  name: itcast
  age: 16
  tel: 4006184000
  subject:
    - Java
    - 前端
    - 大數據

三、3種yaml配置文件數據讀取

3.1 環境準備

新創建一個名為 springboot_03_read_dataSpringBoot 工程,參考Java開發學習(三十五)—-SpringBoot快速入門及起步依賴解析目錄結構如下

com.itheima.controller 包寫創建名為 BookController 的控制器,內容如下

@RestController
@RequestMapping("/books")
public class BookController {
​
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("id ==> "+id);
        return "hello , spring boot!";
    }
}

com.itheima.domain 包下創建一個名為 Enterprise 的實體類等會用來封裝數據,內容如下

public class Enterprise {
    private String name;
    private int age;
    private String tel;
    private String[] subject;
    
    //setter and getter
    
    //toString
}

resources 下創建一個名為 application.yml 的配置文件,裡面配置了不同的數據,內容如下

lesson: SpringBoot
​
server:
  port: 80
​
enterprise:
  name: itcast
  age: 16
  tel: 4006184000
  subject:
    - Java
    - 前端
    - 大數據

3.2 讀取配置數據

3.2.1 使用 @Value註解

使用 @Value("表達式") 註解可以從配合文件中讀取數據,註解中用於讀取屬性名引用方式是:${一級屬性名.二級屬性名……}

我們可以在 BookController 中使用 @Value 註解讀取配合文件數據,如下

@RestController
@RequestMapping("/books")
public class BookController {
    
    @Value("${lesson}")
    private String lesson;
    @Value("${server.port}")
    private Integer port;
    @Value("${enterprise.subject[0]}")
    private String subject_00;
​
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println(lesson);
        System.out.println(port);
        System.out.println(subject_00);
        return "hello , spring boot!";
    }
}

使用postman調介面

可以看到結果已經返回

3.2.2 Environment對象

上面方式讀取到的數據特別零散,SpringBoot 還可以使用 @Autowired 註解注入 Environment 對象的方式讀取數據。這種方式 SpringBoot 會將配置文件中所有的數據封裝到 Environment 對象中,如果需要使用哪個數據只需要通過調用 Environment 對象的 getProperty(String name) 方法獲取。具體程式碼如下:

@RestController
@RequestMapping("/books")
public class BookController {
    
    @Autowired
    private Environment env;
    
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println(env.getProperty("lesson"));
        System.out.println(env.getProperty("enterprise.name"));
        System.out.println(env.getProperty("enterprise.subject[0]"));
        return "hello , spring boot!";
    }
}

注意:這種方式,框架內容大量數據,框架使用的比較多,而在開發中我們很少使用。

3.2.3 自定義對象

SpringBoot 還提供了將配置文件中的數據封裝到我們自定義的實體類對象中的方式。具體操作如下:

  • 將實體類 bean 的創建交給 Spring 管理。

    在類上添加 @Component 註解

  • 使用 @ConfigurationProperties 註解表示載入配置文件

    在該註解中也可以使用 prefix 屬性指定只載入指定前綴的數據

  • BookController 中進行注入

具體程式碼如下:

Enterprise 實體類內容如下:

@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
    private String name;
    private int age;
    private String tel;
    private String[] subject;
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public String getTel() {
        return tel;
    }
​
    public void setTel(String tel) {
        this.tel = tel;
    }
​
    public String[] getSubject() {
        return subject;
    }
​
    public void setSubject(String[] subject) {
        this.subject = subject;
    }
​
    @Override
    public String toString() {
        return "Enterprise{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", tel='" + tel + '\'' +
                ", subject=" + Arrays.toString(subject) +
                '}';
    }
}

BookController 內容如下:

@RestController
@RequestMapping("/books")
public class BookController {
    
    @Autowired
    private Enterprise enterprise;
​
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println(enterprise.getName());
        System.out.println(enterprise.getAge());
        System.out.println(enterprise.getSubject());
        System.out.println(enterprise.getTel());
        System.out.println(enterprise.getSubject()[0]);
        return "hello , spring boot!";
    }
}

注意:使用第三種方式,在實體類上有如下警告提示

這個警告提示解決是在 pom.xml 中添加如下依賴即可

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>