spring boot配置及原理學習
1.産生背景
我們知道,在技術領域,任何一項新技術的出現都是為了解決老技術的不足或者是使用的不友善。在java開發領域,spring憑借其優秀的特性成為很多企業都會使用的架構,但是其缺點就是我們需要手動編寫一堆xml配置檔案來進行維護,随着項目的擴大,xml檔案越來越多,越來越難維護,是以spring boot出現了。它也是spring家族的一個産品,其實它本身并不是一個新技術,隻不過對spring進行了再封裝,它盡可能幫我們配置好一些東西,簡化我們的開發!總之一句話,就是約定大于配置,其含義就是spring boot會預設按照他的約定去做一些事情,不需要你再手動配置,如果偏離了約定,那麼需要手動配置。
2.Spring Boot主要特性
https://www.jianshu.com/p/72b09eb6ee25
- 遵循“約定優于配置”的原則,簡化配置
- 可以完全脫離XML配置檔案,采用注解配置和java Config
- 内嵌Servlet容器,應用可用jar包執行:java -jar
- 快速完成項目搭建、整合第三方類庫,友善易用
- 提供了starter POM, 能夠非常友善的進行包管理, 簡化包管理配置
- 與Spring cloud天然內建,spring boot是目前java體系内實作微服務最佳方案
3.快速建構一個spring boot程式
3.1官網下載下傳

用idea倒入項目
3.2 idea建立(開發使用)
4.原理初探
4.1pom.xml
- spring-boot-dependencies是核心依賴,在其父工程中。
- spring-boot-starter是啟動器,是根據場景劃分的,例如要使用web的東西,直接依賴spring-boot-starter-web
- 我們要使用什麼功能,隻需要找到對應的啟動器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
4.2主程式
@SpringBootApplication //表示是一個springboot應用
public class SpringBootStudyApplication {
public static void main(String[] args) {
//啟動應用
SpringApplication.run(SpringBootStudyApplication.class, args);
}
}
5.spring boot配置
spring boot的配置檔案一般有兩種方式,yaml和properties,properties用法固定且需要手動設定編碼格式,yaml用法靈活且代碼量更少,是以一般建議使用yaml格式進行配置。
5.1yaml配置
- 冒号後面必須有一個空格,不能省略以縮進來控制層級關系
- 左邊對齊的為同一層級
- 屬性和值的大小寫敏感
- 雙引号中的特殊字元會轉義輸出,如"hello \n world"會發生換行
- 單引号中的特殊字元會原樣輸出,如‘hello \n world’所見即所得
yaml給對象指派
@Component
@ConfigurationProperties(prefix = "user")
public class User {
int age;
String name;
List list;
Map map;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
", list=" + list +
", map=" + map +
'}';
}
}
user:
age: 18
name: 測試
map: {v1: h1,v2: h2}
list:
- a
- b
- c
yaml松散綁定給對象指派
yaml松散綁定給對象指派指的是在yaml中可以用last-name的格式給用駝峰規則命名的屬性lastName指派
yaml和jsr303校驗
- jsr303可以對對象的屬性做一些校驗,例如判斷為null或者郵箱格式等
- 導入校驗相關依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 常見參數
5.2多環境配置及配置檔案位置
配置檔案位置
yaml檔案有四種存放位置,其按讀取優先級排序如下:
- /config/application.yaml //項目目錄(根目錄)下的config檔案夾下
- /application.yaml //直接在項目目錄(根目錄)下
- /src/main/resources/config/application.yaml
- /src/main/resources/application.yaml //預設使用
多環境配置
在實際開發中,一般會有多套環境,進而也有多份配置對應
properties方式配置
可在預設配置中使用spring.profiles.active進行環境指定
yam方式配置
yam可以在一份檔案中配置多個環境
6.自動配置原理再探究
前面我們研究過,spring boot實際上會去尋找spring-boot-autoconfigure-2.3.4.RELEASE.jar包目錄下META-INF/spring.factories,spring.factories裡面定義了具體功能的配置類,該配置類利用@EnableConfigurationProperties和具體的屬性類相關聯,屬性類通過@ConfigurationProperties和yaml為屬性指派,spring boot配置類屬性會有預設值,如果不想使用預設值,則需要在yaml中進行顯示聲明,也就是說xxxAutoConfigurationpei配置類會和xxxProperties屬性類關聯,而xxxProperties又會和配置檔案進行綁定,是以我們可以在配置檔案中進行屬性配置,這就是自動配置原理。同時,xxxAutoConfigurationpei配置類使用@Conditional開頭的注解進行相關生效判斷。
例如spring.factories下的HttpEncodingAutoConfiguration
HttpEncodingAutoConfiguration配置類
ServerProperties.class屬性類
SpringBoot内置條件注解
通過配置debug可以看到哪些配置類生效
已經生效的類
未生效的類
無條件的類