- 優點
- 使用嵌入式的Servlet容器,應用無需打包成WAR包
- starters自動依賴版本與控制版本
- 自動配置,簡化開發,可修改默認值
- 無需配置XML,無代碼生成開箱即用
- 準生產環境的運行時引用監控
- 與雲計算天然集成
微服務(架構風格)
Martin fowler
一個小型服務是一組小型服務,通過HTTP溝通
單體應用:All In One,把所有功能放在單一進程中,優點是開發測試、部署簡單
微服務:將每個功能元素髮到一個獨立的服務中,通過掛服務器分發服務進行擴展
快速構建應用->spring boot
網站互聯互調->spring cloud
- 學習環境
- jdk1.8
- maven3.x
- IDEA2017
- SpringBoot 1.5.9.RELEASE
- 創建maven項目
- 引入starters
- 創建主程序
- 啓動運行
管理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配置
- 配置文件,配置文件名是固定的
- application.properties
- application.yml
作用:修改SpringBoot自動配置的默認值
加載順序
配置原理
TAML
(YAML Ain‘t Markup Language)是一個標誌語言
- YAML基本語法
- 使用縮進表示層級關係
- 縮進時不允許使用tab鍵,只允許使用空格,空格的縮進控制層級關係
- 縮進的空格數目不重要,只要相同層級的元素左對齊即可
- 大小寫敏感
- 支持的三種數據結構
- 對象:鍵值對的組合、(Map、對象)
friends: {lastName:zhangsan,age:18}
- 數組:一組按次序排列的值、(List、Set)
- 用-值表示數組中的
pets: - cat - dog - pig 行內寫法: pets:[cat,dog,pig]
- 字面量:單個的、不可再分的值(數字、字符串、布爾),字符串默認不用加上單引號或雙引號
- “”:雙引號,不會轉義字符裏面的特殊字符,特殊字符會表示的意思
- ‘’:單引號,會轉義特殊字符,特殊字符最終只是一個普通的字符串數據
key:(空格)value
配置文件值注入
- 在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.int}、{random.long}、{random.int[1024,65536]}
- 在配置文件中引用前面配置過的屬性(優先級前面配置過的這裏能用)
- ${app.name:默認值}來指定找不到屬性的默認值
Profile
Spring隨不同環境不同配置功能的支持,可以通過激活、指定參數等方式快速切換環境
- 多profile文件形式
- 格式:
application-{profile}.properties/yml
- application-dev.properties、application-prod.properties
- 多profile文檔塊模式:yml文件用—分成不同文檔塊,在用
spring:profiles:dev
指定屬於開發環境或spring:profiles:active:dev
激活開發環境 - 激活方式
- 命令行: java -jar jar包的名字 --spring.profiles.active = dev
- 配置文件:在配置文件中指定 spring.profiles.active = dev
- jvm參數: -Dspring.profiles.active = dev
配置文件加載位置
- 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
來改變默認配置,項目打包好之後使用命令行參數的形式,啓動項目時指定配置文件的新位置;指定配置文件和默認加載的配置文件共同起作用形成互補配置
外部配置加載順序
-
命令行參數
所有的配置都可以在命令行上進行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多個配置用空格分開; --配置項=值 -
來自java:comp/env的JNDI屬性
-
Java系統屬性(System.getProperties())
-
操作系統環境變量
-
RandomValuePropertySource配置的random.*屬性值
由jar包外向jar包內進行尋找; 優先加載帶profile
-
jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
-
jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
再來加載不帶profile -
jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
-
jar包內部的application.properties或application.yml(不帶spring.profile)配置文件
總結:優先加載帶profile,再加載不帶profile。由jar包外向jar包內尋找。會先加載項目打包後的jar包統一目錄下的配置文件
11. @Configuration註解類上的@PropertySource
12. 通過SpringApplication.setDefaultProperties指定的默認屬性
所有支持的配置加載來源;
優先級從高到低
自動配置原理
配置文件能寫什麼?怎麼寫?
- 查看HttpEncodingAutoConfiguration
- 通用模式
- xxxAutoConfiguration:自動配置類
- xxxProperties:屬性配置類
- yml/properties文件中能配置的值來源於[屬性配置類]
- 幾個重要註解
- @Bean
- @Conditional
- –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):判斷條件