天天看點

spring boot配置及原理學習spring boot配置及原理學習

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官網下載下傳

spring boot配置及原理學習spring boot配置及原理學習

用idea倒入項目

spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習

3.2 idea建立(開發使用)

spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習

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);
    }

}
           
spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習

5.spring boot配置

​ spring boot的配置檔案一般有兩種方式,yaml和properties,properties用法固定且需要手動設定編碼格式,yaml用法靈活且代碼量更少,是以一般建議使用yaml格式進行配置。

5.1yaml配置

  1. 冒号後面必須有一個空格,不能省略以縮進來控制層級關系
  2. 左邊對齊的為同一層級
  3. 屬性和值的大小寫敏感
  4. 雙引号中的特殊字元會轉義輸出,如"hello \n world"會發生換行
  5. 單引号中的特殊字元會原樣輸出,如‘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
           
spring boot配置及原理學習spring boot配置及原理學習

yaml松散綁定給對象指派

​ yaml松散綁定給對象指派指的是在yaml中可以用last-name的格式給用駝峰規則命名的屬性lastName指派

spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習

yaml和jsr303校驗

  • jsr303可以對對象的屬性做一些校驗,例如判斷為null或者郵箱格式等
  • 導入校驗相關依賴
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
           
spring boot配置及原理學習spring boot配置及原理學習
spring boot配置及原理學習spring boot配置及原理學習
  • 常見參數
spring boot配置及原理學習spring boot配置及原理學習

5.2多環境配置及配置檔案位置

配置檔案位置

yaml檔案有四種存放位置,其按讀取優先級排序如下:

  1. /config/application.yaml //項目目錄(根目錄)下的config檔案夾下
  2. /application.yaml //直接在項目目錄(根目錄)下
  3. /src/main/resources/config/application.yaml
  4. /src/main/resources/application.yaml //預設使用

多環境配置

​ 在實際開發中,一般會有多套環境,進而也有多份配置對應

properties方式配置

spring boot配置及原理學習spring boot配置及原理學習

​ 可在預設配置中使用spring.profiles.active進行環境指定

spring boot配置及原理學習spring boot配置及原理學習

yam方式配置

​ yam可以在一份檔案中配置多個環境

spring boot配置及原理學習spring boot配置及原理學習

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

spring boot配置及原理學習spring boot配置及原理學習

HttpEncodingAutoConfiguration配置類

spring boot配置及原理學習spring boot配置及原理學習

ServerProperties.class屬性類

spring boot配置及原理學習spring boot配置及原理學習

SpringBoot内置條件注解

spring boot配置及原理學習spring boot配置及原理學習

通過配置debug可以看到哪些配置類生效

spring boot配置及原理學習spring boot配置及原理學習

已經生效的類

spring boot配置及原理學習spring boot配置及原理學習

未生效的類

spring boot配置及原理學習spring boot配置及原理學習

無條件的類

spring boot配置及原理學習spring boot配置及原理學習