1. 程式人生 > >SpringBoot 學習筆記二 配置檔案詳解

SpringBoot 學習筆記二 配置檔案詳解

在建立SpringBoot專案時,工程會自動建立一個application.properties,或者application.yml,兩種檔案格式都支援,這裡用application.yml,加入以下配置,注意空格

1. 引入依賴

        <!-- web 使專案擁有web功能,該包自動依賴了springweb,MVC等包,可以點進去檢視 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId
>
spring-boot-starter-web</artifactId> </dependency> <!-- 要使用ConfigurationProperties註解來讀取外部配置檔案屬性的話必須引入該依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId
>
<optional>true</optional> </dependency>

2. 新建application.yml

輸入內容如下,yml語法不知道的可以百度一下

person:
  name: 殷俊傑
  age: 18
  habits:
    - watch movies
    - play hhh
  schools: { high: 縣三,university: 河南科技學院}
  dog:
    name: 二哈
    age: 2

pname: springboot練習

3. 新建Person類對應person的各項屬性

ConfigurationProperties註解表示從配置檔案讀取屬性值,prefix表示只讀取person的屬性,該配置類必須標明為一個元件注入到容器中

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private List habits;
    private Map schools;
    private Dog dog;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", habits=" + habits +
                ", schools=" + schools +
                ", dog=" + dog +
                '}';
    }
}

Dog類如下

public class Dog {
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

4. 該方式也可以從單獨的properties檔案中讀取配置,yml也可以

新建一個cat.properties檔案輸入內容如下

cat.name=喵喵喵
cat.age=3
cat.email=dlsjkfklajsierwt

5. 新建Cat類

@Component
//由於該類的屬性是從單獨的配置檔案中讀取,並不是spring預設的配置檔案所以需要一個PropertySource屬性指定配置檔案
@PropertySource("classpath:cat.properties")
@ConfigurationProperties(prefix = "cat")
@Validated
public class Cat {

    private String name;
    private Integer age;
//    @Email
    private String email;

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                '}';
    }
}

6. 新建controller進行測試

package com.yjj.web;

import com.yjj.config.Cat;
import com.yjj.config.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.Email;

/**
 * @Description:
 * @Author: yinjunjie
 * @CreateDate: 2018/7/11 16:13
 * @Version: 1.0
 */
@RestController
@RequestMapping("test")
public class TestController {

    @Autowired
    private Person person;
    @Autowired
    private Cat cat;

    @Value("${pname}")
    @Email
    private String projectName;
    //#可以使用spring表示式SpEl
    @Value("#{cat.getEmail()}")
    private String catEmail;
    @Value("#{100/2}")
    private Integer num;

    @GetMapping("/person")
    public String getPerson(){
        System.out.println(person);
        System.out.println(cat);
        System.out.println(projectName);
        System.out.println(catEmail);
        System.out.println(num);
        return "ok";
    }
}

以上程式碼均經過測試,準確輸出

注意:
1. 使用ConfigurationProperties註解時必須在啟動類或者Controller類上加入EnableAutoConfiguration註解表示開啟自動配置功能
2. #可以使用SpEl表示式語法
3. @Value不支援JSR303資料校驗,比如Email校驗,使用@ConfigurationProperties時候如果屬性值不符合要求會報錯,但是@Value沒反應,不做校驗

7. @Value獲取值和@ConfigurationProperties獲取值比較

內容 @ConfigurationProperties @Value
功能 批量注入配置檔案中的屬性 一個個指定
鬆散繫結(鬆散語法) 支援 不支援
SpEL 不支援 支援
JSR303資料校驗 支援 不支援
複雜型別封裝map、list等 支援 不支援

如果不是單獨做一個配置檔案bean的話,在controller或者service中,讀取屬性值只需要在屬性上加上
@Value註解即可

8. 配置檔案屬性可以用${屬性名}來引用

如果為空可以用${屬性名:預設值}來指定預設值,不再演示

9. 多環境配置檔案

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

spring:
  profiles:
    active: dev

新建application-dev.yml

server:
  port: 8082

然後啟動專案發現已經執行在8082埠啦,好神奇 哈哈哈

多環境配置檔案可以使用多種方式實現,可以在預設properties檔案中指定spring.profiles.active=dev
也可在yml中分塊,也可在idea的Program arguments裡寫–spring.profiles.active=dev
也可以在idea的VM options中寫-Dspring.profiles.active=dev

10. 配置檔案預設載入位置優先順序

springboot啟動會掃描一下位置的application.properties或者application.yml檔案
-file:./config/
-file:./
-classpath:/config/
-classpath:/
由高到低,高優先順序配置會覆蓋低優先順序配置,springboot會載入全部的配置,然後互補配置,高優先順序的用高優先順序的,低優先順序的如果在高優先順序不存在則也會生效
我們還可以通過spring.config.location=. 來指定配置檔案位置,不過必須使用命令列引數的形式,指定配置檔案和預設配置檔案會一起被載入然後互補配置。

11.配置bean的幾種方式