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=. 來指定配置檔案位置,不過必須使用命令列引數的形式,指定配置檔案和預設配置檔案會一起被載入然後互補配置。