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_data
的 SpringBoot
工程,參考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>