Spring Boot-開發基礎2

spring官網

  • 優點
    • 使用嵌入式的Servlet容器,應用無需打包成WAR包
    • starters自動依賴版本與控制版本
    • 自動配置,簡化開發,可修改默認值
    • 無需配置XML,無代碼生成開箱即用
    • 準生產環境的運行時引用監控
    • 與雲計算天然集成

微服務(架構風格)

Martin fowler

一個小型服務是一組小型服務,通過HTTP溝通
單體應用:All In One,把所有功能放在單一進程中,優點是開發測試、部署簡單
微服務:將每個功能元素髮到一個獨立的服務中,通過掛服務器分發服務進行擴展
快速構建應用->spring boot
網站互聯互調->spring cloud

  • 學習環境
    • jdk1.8
    • maven3.x
    • IDEA2017
    • SpringBoot 1.5.9.RELEASE
  1. 創建maven項目
  2. 引入starters
  3. 創建主程序
  4. 啓動運行

管理springboot應用裏面的所有依賴版本,默認不需要寫版本

父項目:版本仲裁中心,沒有在dependencies裏面管理的依賴自然需要聲明版本號
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

導入的依賴

spring-boot-starter:spring-boot場景啓動器,幫我們導入了web模塊正常運行所依賴的組件

Spring Boot將所有的功能常見抽取出來,做成一個個starters(啓動器),只需要在項目裏面引入這些starter相關場景相關依賴導入

主程序類,主入口類

  • @SpringBootApplication標註一個主程序類、主配置類,說明這是一個Spring Boot應用
    他是組合註解
    • @SpringBootConfiguration:Spring Boot的配置類
    • 標註在某個類上,表示類上是一個Spring Boot的配置類
      • @Configuration:配置類上來標註這個註解
      • 配置類—配置文件;配置類也是容器中的一個組件@Componetn
    • @EnableAutoConfiguration:告訴springboot開啓自動配置功能
    • @AutoConfigurationPackage:自動配置包
      • @Import(AutoConfigurationPackage.Registrar.class)給容器導入組件
      • 將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中
      • 會給容器中導入非常多的自動配置類(xxAutoConfiguration),就是給容器中導入這個場景需要的所有組件,並配置好這些組件
      • Spring Boot在啓動的時候從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作爲自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作
        將主配置類(@SpringBootApplication標註的類)的所在包及下面所有子包裏面的所有組件掃描到Spring容器

J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar

Spring Boot配置

  1. 配置文件,配置文件名是固定的
  • application.properties
  • application.yml
    作用:修改SpringBoot自動配置的默認值

加載順序
配置原理

TAML

(YAML Ain‘t Markup Language)是一個標誌語言

  1. YAML基本語法
  • 使用縮進表示層級關係
  • 縮進時不允許使用tab鍵,只允許使用空格,空格的縮進控制層級關係
  • 縮進的空格數目不重要,只要相同層級的元素左對齊即可
  • 大小寫敏感
  1. 支持的三種數據結構
  • 對象:鍵值對的組合、(Map、對象)
friends: {lastName:zhangsan,age:18}
  • 數組:一組按次序排列的值、(List、Set)
    • 用-值表示數組中的
    pets: 
    	- cat
    	- dog
    	- pig
    行內寫法:
    pets:[cat,dog,pig]
    
  • 字面量:單個的、不可再分的值(數字、字符串、布爾),字符串默認不用加上單引號或雙引號
    • “”:雙引號,不會轉義字符裏面的特殊字符,特殊字符會表示的意思
    • ‘’:單引號,會轉義特殊字符,特殊字符最終只是一個普通的字符串數據

key:(空格)value

配置文件值注入

  1. 在bean文件中添加註解@ConfigurationProperties(prefix=“person即yml的數據”)
  • 告訴SpringBoot將本類中的所有屬性和配置文件中相關的配置進行綁定
  • 配置文件中哪個下面的所有屬性進行一一映射
  • 在pom.xml導入配置文件處理器,配置文件進行綁定就會有提示
作用:生成配置文件的元數據信息
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
     <scope>true</scope>
</dependency>

只有這個組件時容器中的組件才能提供@ConfigurationProperties功能

當輸出亂碼時的解決方法:
setting->File Encodings
亂碼

@value("${person.last-name}")獲取值

相當於

<bean class="Person">
	<property name="lastName" value="字面量/${key}從環境配置、配置文件獲取值/#{SpEL}"></property >
</bean>

@ConfigurationProperties

  • 與@Bean結合爲屬性賦值、默認從全局配置文件中獲取值
  • @PropertySource(只能用於properties文件)結合讀取指定文件:加載指定文件
  • @Validated進行文件值校驗,@NotNull、@Valid
  • @ImportResource:導入Spring的配置文件,讓配置文件裏面的內容生效
@ImportResource(locations={"classpath:beans.xml"})
導入Spring的配置文件讓其生效

區別

@ConfigurationProperties @value
功能 批量注入配置文件中的屬性 一個個指定
鬆散綁定(鬆散語法) 支持 不支持
SpEL 不支持 支持
JSR303數據校驗 支持 不支持
複雜類型封裝 支持 不支持

應用場景

  • 只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value
  • 專門編寫一個javaBean和配置文件進行映射,直接使用@ConfigurationProperties

== 什麼是鬆散綁定==
屬性名匹配規則

  • person.firstName:使用標準方式
  • person.first-name:大寫用-
  • person.first_name:大寫用_
  • PERSON_FIRST_NAME:推薦系統屬性使用這種寫法

SpringBoot推薦給容器中添加組件的方式,使用全註解方式
@Bean:將方法的返回值添加到容器中,容器中的組件默認的id就是方法名

配置文件佔位符

RandomValuePropertySource:配置文件中可以使用隨機數
random.value{random.value}、{random.int}、random.value{random.value}、{random.long}、random.int(10){random.int(10)}、{random.int[1024,65536]}

  • 在配置文件中引用前面配置過的屬性(優先級前面配置過的這裏能用)
  • ${app.name:默認值}來指定找不到屬性的默認值

Profile

Spring隨不同環境不同配置功能的支持,可以通過激活、指定參數等方式快速切換環境

  1. 多profile文件形式
  • 格式:application-{profile}.properties/yml
    • application-dev.properties、application-prod.properties
  1. 多profile文檔塊模式:yml文件用—分成不同文檔塊,在用spring:profiles:dev指定屬於開發環境或spring:profiles:active:dev激活開發環境
  2. 激活方式
  • 命令行: java -jar jar包的名字 --spring.profiles.active = dev
  • 配置文件:在配置文件中指定 spring.profiles.active = dev
  • jvm參數: -Dspring.profiles.active = dev
    JVM參數
    命令行

配置文件加載位置

  • spring boot啓動會掃描以下位置的application.properties或application.yml文件作爲Spring boot的默認配置文件
    • 根目錄:file:./config/
    • file:./
    • classpath:/config/
    • classpath:/
      以上是按照優先級從高到低的順序,所有位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容

SpringBoot會從這四個位置全部加載主配置文件互補配置

server.port=8081
#配置項目的訪問路徑
server.context-path=/boot02

通過spring.config.location來改變默認配置,項目打包好之後使用命令行參數的形式,啓動項目時指定配置文件的新位置;指定配置文件和默認加載的配置文件共同起作用形成互補配置

外部配置加載順序

  1. 命令行參數
    所有的配置都可以在命令行上進行指定
    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc多個配置用空格分開; --配置項=值

  2. 來自java:comp/env的JNDI屬性

  3. Java系統屬性(System.getProperties())

  4. 操作系統環境變量

  5. RandomValuePropertySource配置的random.*屬性值
    由jar包外向jar包內進行尋找; 優先加載帶profile

  6. jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件

  7. jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
    再來加載不帶profile

  8. jar包外部的application.properties或application.yml(不帶spring.profile)配置文件

  9. jar包內部的application.properties或application.yml(不帶spring.profile)配置文件

總結:優先加載帶profile,再加載不帶profile。由jar包外向jar包內尋找。會先加載項目打包後的jar包統一目錄下的配置文件



11. @Configuration註解類上的@PropertySource
12. 通過SpringApplication.setDefaultProperties指定的默認屬性
所有支持的配置加載來源;
外部配置文件
優先級從高到低

自動配置原理

配置文件能寫什麼?怎麼寫?

  1. 查看HttpEncodingAutoConfiguration
  2. 通用模式
    • xxxAutoConfiguration:自動配置類
    • xxxProperties:屬性配置類
    • yml/properties文件中能配置的值來源於[屬性配置類]
  3. 幾個重要註解
    • @Bean
    • @Conditional
  4. –debug查看詳細的自動配置報告

配置文件能配置的屬性參照

原理:1.從main方法啓動,加載springboot配置類,開啓自動配置功能
@EnableAutoConfiguration
將類路徑下META-INF/spring.factories裏面配置的所有EnableAutoConfiguration的值加入到容器中

HttpEncodingAutoConfiguration
所有配置文件中配置的屬性都在xxxProperties類中封裝着。配置文件能配置什麼可以參照這個功能對應的屬性類

HttpEncodingAutoConfiguration(Http編碼自動配置

根據不同條件判斷,決定這個配置類是否生效?

@Configuration    // 配置類
@EnableConfigurationProperties(HttpEncodingProperties.class) // 開啓屬性注入,啓動指定類
ConfigurationProperties功能:將配置文件中對應的值和HttpE能從訂貨Properties綁定起來
HttpEncodingProperties加入到ioc容器中
spring.http.encoding.enabled=true
spring.http.encoding.cahrset=utf-8
spring.http.encoding.force=true
@ConditionalOnWebApplication //Spring底層@Configuration註解,根據不同的條件,如果滿足指定條件,整個配置類裏面的配置生效,判斷當前應用是否是web應用,如果是當前配置類生效

@ConditionalOnClass(CharacterEncodingFilter.class) // 判斷當前項目有沒有這個類
CharacterEncodingFilter:SpringMVC中進行亂碼解決的過濾器

@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)// 當設置spring.http.encoding=enabled的情況下,如果沒有設置默認是true,即符合條件。判斷配置文件中是否存在某個配置"spring.http.encoding.enabled,及時不配置也是默認生效的
@Bean給容器中添加一個組件,這個組件的某些值需要從properties中獲取

一旦這個配置類生效,配置類就會給容器添加各種組件,這些組件的屬性是從對應的properties類中回去的,這些類裏面的每個屬性又是和配置文件綁定的

springboot的配置原理總結

1)、SpringBoot啓動會加載大量的自動配置類
2)、按需求看SpringBoot默認寫好的
3)、自動配置類中到底配置了哪些組件
4)、給容器中自動配置類添加組件時,會從properties類中獲取某些屬性,可在配置文件中指定屬性的值

xxxAutoConfiguration:自動配置類
給容器中添加組件

xxxProperties:封裝配置中的相關屬性

@Conditional(OnClassCondition.class):判斷條件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章