[toc] 一、入門 1、Spring Boot簡介 簡化Spring應用開發的一個框架 整個Spring技術棧的整合 J2EE開發的一站式解決方案 2、微服務 Martin Fowler 微服務是一種架構風格 一個應用應該是一組小型服務:可以通過HTTP的方式進行互通 每一個功能元素最終都是一個可 ...
目錄
一、入門
1、Spring Boot簡介
簡化Spring應用開發的一個框架
整個Spring技術棧的整合
J2EE開發的一站式解決方案
2、微服務
Martin Fowler
微服務是一種架構風格
一個應用應該是一組小型服務:可以通過HTTP的方式進行互通
每一個功能元素最終都是一個可獨立替換和獨立升級的軟體單元
詳細參照微服務文檔
3、環境準備
- jdk1.8
- maven3.x
- IntellijIDEA2019
- SpringBoot 2.2.2.RELEASE
Maven設置
給maven的setting.xml配置文件的profiles標簽添加jdk相關profile
4、SpringBoot HelloWorld
一個功能:瀏覽器發送hello請求,伺服器接受請求並處理,響應Hello World字元串;
1、創建一個,maven工程;
2、導入依賴spring boot相關依賴
3、編寫一個主程式:啟動Spring Boot應用
4、編寫相關的Controller、Service
5、運行主程式測試
6、簡化部署
加入插件spring.boot.maven.plugin,將應用打成jar包,直接使用java -jar的命令進行執行;
5、Hello World探究
- POM文件
父項目
spring.boot.starter.parent
其父項目
spring.boot.dependencies 管理SpringBoot中的所有依賴
spring-boot-starter-web
spring-boot-starter:spring-boot場景啟動器:導入web模塊正常運行所依賴的組件
需要什麼功能就導入相應的場景啟動器
- 主程式類,主入口類
@SpringBootApplication
標註在某個類上,表示是一個SpringBoot的主配置類,SpringBoot運行這個類的main方法來啟動SpringBoot應用;
@SpringBootConfiguration :SpringBoot的配置類
標註在某個類上,表示是一個SpringBoot的主配置類
@Configuration:配置類上標註這個註解
配置類=配置文件,配置類也是容器中的一個組件@Component
@EnableAutoConfiguration :開啟自動配置功能
@AutoConfigurationPackage:自動配置包
@Import(AutoConfigurationPackages.Registrar.class):將著配置類所在包及下麵所有子包裡面的所有組件掃描到Spring容器;
@Import(EnableAutoConfigurationImportSelector.class):將所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器當中;會給容器導入大量自動配置類(xxxAutoConfiguration),從而自動配置場景所需組件。
SpringBoot在啟動時從類路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動配置類導入到容器中,自動配置類就生效,從而進行自動配置工作。
J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar
6、使用Spring Initializer快速創建SpringBoot項目
使用IDE的Spring項目創建享導快速創建SpringBoot項目,選擇所需模塊,嚮導聯網創建Spring Boot項目。
- resources文件夾中目錄結構
- static:保存所有靜態資源:js css images;
- templates:保存所有的模板頁面:(Spring Boot預設jar包使用嵌入式的Tomcat,預設不支持JSP頁面);可以使用模板引擎
- application.properties:SpringBoot應用的配置文件;
二、配置文件
1、配置文件
SpringBoot使用全局配置文件,配置文件名固定
- application.properties
- application.yml
可以修改SpringBoot自動配置的預設值
yml以數據為中心
server:
port:8001
xml
<server>
<port>8001</port>
</server>
2、YAML語法
基本語法
k:(空格)v :表示一個鍵值對
以空格的縮進來控制層級關係,只要是左對齊的一列數據,都是同一層級
屬性和值大小寫敏感
值的寫法
字面量:普通的值 (數字,字元串,布爾)
鍵值對直接寫
字元串預設不加引號,單引號不會轉義,雙引號會轉義
對象、Map:
person: lastName: zhangsan age: 20 person:{lastName: zhangsan,age: 18}
數組:
用- 值表示數組的一個元素
pets: - cat - dog - pig pets: [cat,dog,pig]
3、配置文件的註入
在yml配置文件中進行配置,在javaBean中進行綁定(將配置的值映射到Bean)
@ConfigurationProperties:告訴SpingBoot將本類中的所有屬性和配置文件中相關的配置進行綁定
prefix=”person“,配置文件的person項的所有屬性進行映射
@Component 配置映射只對容器的組件有效
@Component
@ConfigurationProperties(prefix="person")
- properties配置文件在IDEA中預設utf-8編碼可能會出現亂碼,需要設置為在編譯時轉為ascii碼
- @Value和@ConfigurationProperties獲取值有區別
- 配置文件註入值數據校驗@Validated
- @PropertySource&&@ImportResource,前者載入自定義的配置文件,後者將自定義的Spring相關配置生效
@PropertySource(value={"classpath:person.properties"})
@ImportResource(location={"calsspath:bean.xml"})
SpringBoot推薦使用全註解的方式給容器添加組件
- 配置類=Spring配置文件
- 使用@Bean給容器添加組件
@Configuration //配置類
publie class MyAppConfig{
//將方法的返回值添加到容器中,組件預設id為方法名
@Bean
public HelloService helloService(){
//
return new HelloService();
}
}
4、配置文件占位符
- 隨機數
${random.long}、${random.int(10)}、${random.value}、${random.int[1024,65536]}
- 占位符獲取之前配置的值,如果沒有可以使用指定預設值
5、Profile
多Profile文件
主配置文件名可以是application.(profile).properties/yml
Spring預設使用application.properties的配置
yml支持多文檔塊方式
server: port:8001 spring: profiles: active:dev --- server: port:8002 spring: profiles:dev --- server: port:8003 spring: profiles:prod #指定配置環境
激活指定profile
在配置文件中指定spring.profile.active=(profile)
命令行:
java -jar spring-boot-SNAPSHOT.jar --spring.profiles.active=dev;
運行時傳入參數
虛擬機參數
-Dspring.profiles.active=dev
6、配置文件載入位置
SpringBoot啟動會掃描以下位置的application.properties/yml文件作為預設配置文件
file:/config/
file:/
classpath:/config/
classpath:/
優先順序由高到低,配置互補,相同配置項高優先順序會覆蓋低優先順序
也可通過部署運行時在命令中傳參數改變預設配置spring.config.location
7、外部配置載入順序
優先順序由高到低,配置互補,相同配置項高優先順序會覆蓋低優先順序
命令行參數
-- 配置項=值
java系統屬性
操作系統環境變數
jar包外帶profile的配置文件(application.{profile}.properties或application.yml(有spring.profile))
jar包內帶profile的配置文件(application.{profile}.properties或application.yml(有spring.profile))
jar包外的配置文件(application.properties或application.yml(沒有spring.profile))
jar包內的配置文件(application.properties或application.yml(沒有spring.profile))
外部:打成的jar同一文件夾下
內部:項目文件下
@Configuration註解類上的@PropertySource
8、自動配置原理
SpringBoot啟動時載入主配置類,開啟自動配置功能@EnableAutoConfiguration
@EnableAutoConfiguration作用
利用EnableAutoConfigurationImportSelector給容器中導入一些組件 :可以查看select Imports()方法的內容
List
configurations=getCandidateConfigurations(annotationMetadata,attributes);獲取候選配置
SpringFactoriesLoader.loadFactoryNames();
掃描所有jar包類路徑下META-INF/spring.factories
把掃描到的這些文件的內容包裝成properties對象
從properties中獲取到EnableAutoConfiguration.class類名對應的值,然後把他們添加到容器中
將類路徑下META-INF/spring.factories裡面配置的所有EnableAutoConfiguration的值加入到了容器中;
每一個自動配置類進行自動配置功能
所有 在配置類中能配置的屬性都是在xxxProperties類中封裝著;
精髓:
- SpringBoot啟動會載入大量的自動配置類
- 我們需要看項目所需功能有沒有SpringBoot預設寫好的自動配置類
- 再看自動配置類中到底配置了那些組件
- 給容器自動配置類添加組件時會從properties類中獲取某些屬性,我們可以在配置文件中指定這些屬性的的值
細節
@Conditional派生註解:註解指定的條件成立,才給容器添加組件,配置里的內容才生效
@Conditional派生註解 作用 @ConditionalOnJava java版本是否符合要求 @ConditionalOnBean 存在指定Bean @ConditionalOnMissingBean 不存在指定Bean @ConditionalOnExpression 滿足SpEL表達式指定 @ConditionalOnClass 有指定類 @ConditionalOnMissingClass 沒有指定類 @ConditionalOnSingleCandidate 只有一個指定Bean @ConditionalOnProperty 指定屬性是否有指定值 @ConditionalOnResource 類路徑下是否存在資源文件 @ConditionalOnWebApplication 當前是Web環境 @ConditionalOnNotWebApplication 當前不是Web環境 自動配置類必須在一定條件下才能生效
通過在配置文件中啟用debug=true屬性,讓控制台自動列印配置報告,可以很方便知道哪些自動配置類生效