前言
大體翻了一下《springboot實戰》這一本書,相比以前的文章,整體來講,沒有什麼乾貨,實戰感受也談不上。僅當一本普通的科普讀物,記錄一下學習筆記。看完能夠了解一些基本的知識,大體以下:html
- springboot的特性有哪些?
- 爲何在配置文件裏面配置一些變量,springboot就能提供某些功能?
- springboot內部自動配置原理是什麼?內部如何實現?
- 常見的一些自定義配置有哪些?
- springboot提供的actuator是什麼?配置以後,有什麼用?如何本身定製actuator?
目錄
概述
起步依賴
自動配置
自定義配置
測試
Actuator
部署
總結
一. 概述
發展史部分參考java
1. spring家族發展史
- 2002年,Rod Johson撰寫了一本Expert One-on-One J2EE設計的書,提出了依賴注入的解決方案
- 2004年:spring1.0發佈,依賴注入和聲明式事務意味着組件直接不存在緊耦合,改變了開發企業級java應用程序的方式
- 2006年:spring2.0發佈,下載量超過100w, 能夠在配置裏使用自定義的xml命名空間,更簡單的配置讓spring更好使用
- 2007年,spring2.5發佈,更優雅的面向註解的依賴注入模型(@Component和@Autowired)和麪向註解的spring MVC編程模型
- 2009年,spring3.0發佈,全新的javabean配置取代xml,@Enable開頭的註解獲得完善,能夠書寫沒有xml的程序
- 2013年,spring4.0發佈,spring框架的一大進步,支持java8, 更高的第三方依賴,條件化配置,根據應用程序的classpath,環境等決定使用哪些配置
- springboot:實現自動配置,起步依賴,actuator等
2. springboot發展史
- 2012年:Mike Youngstrom在spring jira中建立了一個功能需求:在spring框架中支持無容器web應用程序
- 2013年:開始研發該需求
- 2014年:springboot 1.0.0版本發佈
- 2014年:springboot 1.1版本: 支持elasticsearch和Apache solr
- 2015年:springboot 1.2版本:升級到tomcat8,spring4.1,支持SpringBootApplication註解
- 2016年:springboot 1.3版本:支持spring-boot-devtools,部門自動配置和可執行的jar
- 2017年1月:springboot 1.4:分析穹頂失敗和RestTemplateBuilder
- 2017年2月:sprinboot 1.5:支持kafka,動態修改應用程序日誌級別
- 2018年3月:springboot2.0:基於java8,支持java9,支持Quartz,支持嵌入netty
3. springboot特性
- 自動配置:自動根據配置文件的一些屬性配置相應的bean,無需手動配置
- 起步依賴:自動管理jar包依賴
- 命令行界面:自動檢測代碼依賴哪一個包
- actuator:提供在運行時見識應用程序內部狀況的能力
4. sprinboot不是什麼
- 不是應用服務器:在應用程序裏嵌入了一個servlet容器
- 沒有引入任何形式的代碼生成,只是利用了條件化配置特性以及maven的傳遞依賴解析實現自動配置
二. 起步依賴
1. 本質
起步依賴本質是一個maven項目對象模型(project object module,pom),定義了其餘庫的傳遞依賴。經過傳遞依賴,添加一個依賴項就至關於添加了一堆依賴項web
2. 特色
- 只需添加一個依賴就替代繁瑣的一堆依賴
- 不須要指定版本號,起步依賴自動定義好互相之間能夠兼容的依賴版本
- 能夠經過自定義版本號覆蓋默認的版本號
- 經過exclusions配置,排除某些依賴
三. 自動配置
1. 原理:
利用了spring的條件化配置,容許配置存在於應用程序中,在知足某些特定條件以前都會忽略這個配置spring
2. 實現:
- 知足的條件:定義一個類XXX.java實現Condition接口,重寫matches方法
- 使用:在要被初始化的bean前面使用@Conditional(XXX.class),即實現了條件化配置
3. springboot自定義的條件配置
- ConditionalOnBean: 配置了特定的bean
- ConditionalOnMissingBean: 沒有配置特定的bean。關鍵註解,用戶若是自定義了一個bean,就不會使用自動配置的bean。
- ConditionalOnClass: classpath裏有指定的bean
- ConditionalOnMissingClass:classpth裏缺乏指定的bean
- ConditionalOnExpression:特定的表達式爲true
- ConditionalOnJava:匹配特定的java版本
- ConditionalOnProperty:特定的配置屬性有一個明確值
- ConditionalOnWebApplication: 是一個web應用程序
- ConditionalOnNotWebApplication:不是一個web程序
4. 源碼實例:
- DataSourceAutoConfiguration使用了@ConditionalOnClass註解,classpath裏須要有DataSource類和EmbededDatabaseType類纔會自動配置,不然配置就會被忽略。
使用spring security自動配置的條件
- classpath中要有WebSecurityConfiguerAdapter類
- 沒有自動配置WebSecurityConfigureAdapter實體類
- 是一個web應用程序
四. 自定義配置
使用自動配置能夠不用手動配置bean,若是修改配置的某個參數,是否自動配置就不生效了呢? 答案是否認的,springboot提供了300多個用於微調的屬性,能夠自由掌握配置。數據庫
1. 屬性配置來源(優先級由高到低,高覆蓋低)
- 命令行參數
- java:comp/env裏的JNDI屬性
- JVM系統屬性
- 操做系統環境變量
- 應用程序之外的application.properties或application.yml
- 打包在應用程序內的application.properties或application.yml(yml優先級高於properties)
- 經過@PropertySource標註的屬性源
- 默認屬性
2. 自動配置屬性實例
2.1 配置嵌入式服務器
2.2 配置日誌
- 默認:logback輸出info級別到控制檯
- 自定義配置:
2.3 配置數據源:
無需指定jdbc驅動,會根據url自動識別編程
```
spring:
datasource:
url: xxx
username: xxx
password: xxx
```
複製代碼
2.4 配置自定義屬性
- 在application.yml中指定配置屬性的名稱和值
- 在配置類中使用@ConfigurationProperties(prefix="XX")
- 在配置類中聲明要注入的變量和setter方法
注意:瀏覽器
- @ConfigurationProperties不會自動識別,須要添加@EnableConfigurationProperties註解,由於sprinboot已經自動添加了,無需手動再添加
- springboot屬性解析器會自動把駝峯規則的屬性和使用連字符或下劃線的同名屬性關聯起來
3. profile配置
- 使用@Profile("production") 註解
- 配置不一樣的application-{profile}.properties或yml文件
- 在同一個yml文件中配置,用---分隔開
五. 測試
1. spring測試
- @RunWith(SpringJunit4ClassRunner.class) 開啓spring集成測試
- @ContextConfiguration 指定加載應用程序上下文
2. springboot測試
- @SpringApplicationConfiguration 開啓springboot集成測試
- @WebAppConfiguration 開啓web測試
- MockMvc 在一個模擬的servlet容器裏測試
- @WebIntegrationTest 啓動一個嵌入式Servlet容器,配合RestTemplate測試
3. html頁面測試
六. Actuator
1. 概述
提供不少生產級的特性,好比監控和度量springboot應用程序。提供不少端點用於瞭解應用程序內部運行情況tomcat
2. 端點分類
2.1 bean
- 獲取上下文中全部注入的bean
- 包括五類信息
- bean: 名稱或id
- resource:class文件的物理位置,url格式
- dependencies:注入的bean列表
- scope:做用域
- type:java類型
2.2 autoconfig
- 列出了自動配置時哪些條件知足,哪些條件不知足,爲何會生成某個bean
- 提供衆多帶有@Conditional註解的配置類
2.3 env
- 列出全部環境屬性列表,不管是否被用到
- 包括環境變量,JVM屬性,命令行參數,配置文件屬性
- 屬性裏面帶有password,secret,key的屬性都會被隱藏,只顯示*
2.4 mappings
2.5 metrics
列出一系列應用程序度量信息 springboot
- gc.*: 垃圾收集相關。java.lang.management.GarbageCollectorMXBean獲得
- mem.*: 內存相關。java.lang.RunTime
- heap.*: 堆相關。java.lang.management.MemoryUsage
- classes.*: 類加載器相關。
- processors,uptime,instance等:系統相關
- threads.*: 線程池相關
- datasource.*: 數據源
- httpsessions.*: tomcat會話相關
- counter.status.*: Http相關
2.6 trace
2.6 dump
2.7 health
- 監控應用程序監控情況
- 還能夠看到磁盤空間信息,數據庫信息等
- 由一個或多個監控指示器組成,根據classpath裏類決定
- 下圖是springboot自帶的health指示器
2.8 shutdown
2.9 自定義信息
- url參數若是填配置文件中某個前綴,就會返回對應的屬性值
3. 定製Actuator
3.1 概述
定製actuator的方式有:bash
- 重命名端點
- 啓用或者禁用端點
- 自定義度量信息
- 建立自定義倉庫存儲跟蹤信息
- 插入自定義的健康指示器
3.2 重命名端點
3.3 啓用和禁用端點
- 默認狀況下,2.0.1以前的版本,除了/shutdown外,都啓用。2.0.1以後的版本,默認只啓用部分端點
- 禁用端點:endpoints.endpoint-id.id.enabled=false
- 禁用所有端點:endpoints.enabled=false
3.4 添加自定義度量信息
3.5 建立自定義跟蹤倉庫
- 默認狀況下,/trace端點跟蹤的信息都存儲在內存中,存儲最近100條。
- 可自定義InMemoryHttpTraceRepository,調用setCapacity設置超過100的數目
- 也可繼承HttpTraceRepository接口,重寫add和find方法,將追蹤信息存入mongo或者es等地方
3.6 插入自定義監控指示器
- 實現HealthIndicator接口
- 重寫health方法
七. 部署與工具
1. 構建war文件
- 標籤由jar改成war
- 此時的war包尚未啓用springmvc dispatchservlet的web.xml文件或者servlet初始化類
- 繼承SpringBootInitializer, 從新configure方法,將含有main的主類傳進去
2. 部署到雲端
3. 開發者工具
- 依賴庫:spring-boot-devtools
- 提供的功能:classpath文件變化自動重啓, 資源文件變化自動刷新瀏覽器,遠程開發,默認的開發屬性
3.1 自動重啓
- 第三方jar會放到基礎加載器裏,應用程序代碼放到一個單獨的重啓類加載器裏,檢查變動時只重啓類加載器
- 資源視圖默認被排除:包括/META-INFO/resources, /resources, /static, /public和/template路徑
- 可修改默認的排除目錄:spring.devtools.restart.exclude=/static/, /templates/
- 關閉自動重啓:spring.devtools.restart.enabled=false
- 設置觸發條件重啓:spring.devtools.restart.trigger-file: xx
3.2 LiveReload
- 實現自動刷新瀏覽器
- 須要在瀏覽器中安裝LiveReload插件
總結
簡單回顧下前言裏面的幾個問題
1. springboot的特性有哪些?
自動配置,起步依賴,Actuator
2. 爲何在配置文件裏面配置一些變量,springboot就能提供某些功能?
springboot提供了自動配置功能,自動注入了不少實現類
3. springboot內部自動配置原理是什麼?內部如何實現?
利用了spring4提供的條件配置功能,根據某些條件判斷實現自動配置。所說的條件包括:classpath裏面有沒有依賴某個類,spring裏有沒有配置了特定的bean等等。經過ConditionalOnMissingBean,ConditionalOnBean等註解添加到配置類上。
4. 常見的一些自定義配置有哪些?
數據源配置,日誌配置,profile配置等
5. springboot提供的actuator是什麼?配置以後,有什麼用?如何本身定製actuator?
actuator提供不少應用程序內部情況信息,包括配置的bean信息,健康信息,上下文信息,jvm信息等等。 能夠經過實現HealthIndicator接口,自定製本身的actuator。springboot-admin就是基於actuator作了封裝。