文章目錄
- 一、SpringBoot定義
- 二、SpringBoot優點
- 三、SpringBoot核心注解
- 四、SpringBoot自動裝配原理
- 五、SpringBoot啟動流程
- 六、SpringBoot掃描流程
- 七、Spring和SpringBoot常用注解
- 八、如何了解SpringBoot中的Starter
- 九、SPI機制
- 十、SpringBood的約定優于配置是如何了解的
- 總結
一、SpringBoot定義
用來簡化spring應用的初始搭建以及開發過程,使用特定的方式來進行配置,建立獨立的spring應用程式,嵌入tomcat無需部署war檔案,簡化maven配置,自動配置spring添加對應功能starter自動化配置。
二、SpringBoot優點
- 減少開發時間
- 使用java config有助于避免使用xml
- 避免大量的maven導入和各種版本沖突
- 通過提供預設值快速開始開發
- 沒有單獨的web伺服器需要,意味着不再需要啟動tomcat
- 需要更少的配置,沒有web.xml檔案,隻需添加@Configuration注釋的類,然後添加@Bean注釋的方法,spring将自動加載對象并像以前一樣對其進行管理。
三、SpringBoot核心注解
- @SpringBootApplication:是springBoot的核心注解,主要包含一下3個注解@SpringBootConfiguration:組合了@Configuration注解,實作配置檔案的功能@EnableAutoConfiguration:打開自動配置的功能,也可以關閉某個自動配置的選項@ComponentScan:spring元件掃描
四、SpringBoot自動裝配原理
Spring Boot自動配置的核心注解是@SpringBootApplication,該注解是SpringBoot的啟動類注解,它是一個複核注解,裡面包含
- @SpringBootConfiguration:該注解上有一個@Configuration注解,表示這個SpringBoot啟動類是一個配置類,最終要被注入到spring容器中
-
@EnableAutoConfituration:表示開啟自動配置,它也是一個複合注解,裡面包含@AutoConfigurationPackage該注解上有一個@Import(AutoConfigurationPackages.Registar.class)注解,其中Registrar類的作用是将啟動類所在包下的所有子包的元件掃描注入到spring容器中。@Import(AutoConfigurationImportSelector.class):其中AutoConfigurationImportSelector類中有一個getCandidateConfigurations()方法,該方法通過SpringFactoriesLoader.loadFactoryNames()方法查找位于META-INF/spring.factories檔案中的所有自動配置類,并加載這些類,是以spring.boot在整個的啟動過程中,其實就是在類路徑的META-INF
/spring.factories檔案中找到EnableAutoConfiguration對應的所有的自動配置類,然後将所有自動配置類加載到spring容器中。
五、SpringBoot啟動流程
- 加載配置檔案擷取所有實作SpringApplicationRunListener這個接口的監聽器調用監聽器中的starting方法
- 準備上下文環境
- 建立上下文環境
- 設定完環境變量會調用監聽器的相關方法
- 進入到spring啟動容器的方法servletWebServerApplicationContext類下的refresh方法
- 調用監聽器的started方法
- 計算springboot啟動時間
- 執行監聽器的ready方法
- 啟動完成
六、SpringBoot掃描流程
- 調用run方法中的refreshContext方法
- 調用AbstractApplication中的refresh方法
- 委托給invokeBeanFactoryPostProcessors去處理調用鍊
- 其中一個方法postProcessBeanDefinitionRegistry會去調用processConfigBeanDefinitions解析beandefinitions
- 在processConfigBeanDefinitions中有一個parse方法,其中componentscanParser.parse的方法會掃描目前路徑下的所有component元件
七、Spring和SpringBoot常用注解
- @Autowired:自動導入對象到類中,被注入進的類同樣要被spring容器管理;
- @Component:通用的注解,可标注任意類為spring元件。
- @Repository:對應持久層及DAO層,主要英語資料庫相關操作
- @Service:對應服務層,主要設計一些複雜的邏輯,需要用到Dao層;
- @Controller:對應springMVC控制層,主要用于接受使用者請求并調用service層傳回資料給前端頁面;
- @RestController:是@Controller和@ResponseBody的合集,表示這是個控制器bean,并且将函數的傳回值直接填入HTTP響應體中,是REST風格的控制器。
- @Scope:聲明bean的作用域
- @Configuration:用來聲明配置類,可以使用@Component注解代替
八、如何了解SpringBoot中的Starter
Starter是SpringBoot的四大核心功能特性之一,其他的有自動裝配、Actuator監控、指令行界面。
Starter元件以功能為次元,來維護對應的jar包的版本依賴,使得開發者可以不需要去關心這些版本沖突這種容易出錯的細節。
Starter元件會把對應功能的所有jar包依賴全部導入進來,避免開發者自己去引入依賴帶來的麻煩。
Starter内部內建了自動裝配的機制,程式中依賴對應的Starter元件之後,這個元件自動會內建到Spring生态下,并且對于相關Bean的管理也是基于自動裝配機制來完成的。
九、SPI機制
java spi機制:
META-INF/services/ 目錄:執行個體化該目錄下的類 。
通過ServiceLoader.load方法找到META-INF/services/ 目錄下的檔案,然後拿到檔案配置的全限定名,根據反射去執行個體化該類無論使不使用,都會去執行個體化
springboot spi機制:
META-INF/spring.factories/ 目錄:根據key找到相應的類去執行個體化
SpringFactoriesLoader加載會加載META-INF/spring.factories
從CLASSPATH下的每個Jar包中搜尋所有META-INF/spring.factories配置檔案
然後将解析properties檔案,找到指定名稱的配置後傳回,工廠模式反射建立好bean
需要注意的是,其實這裡不僅僅是會去ClassPath路徑下查找,會掃描所有路徑下的Jar包,隻不過這個檔案隻會在Classpath下的jar包中。
dubbo spi機制:
META-INF/services/ 目錄:該目錄下的 SPI 配置檔案是為了用來相容 Java SPI 。
META-INF/dubbo/ 目錄:該目錄存放使用者自定義的 SPI 配置檔案。
META-INF/dubbo/internal/ 目錄:該目錄存放 Dubbo 内部使用的 SPI 配置檔案。
十、SpringBood的約定優于配置是如何了解的
約定優于配置是一種軟體設計的模式,它的核心思想是減少軟體開發人員對于配置項的維護,進而讓開發人員更加聚焦在業務邏輯上。
SpringBoot就是約定優于配置這一理念下的産物,它類似于Spring架構下的一個腳手架,通過SpringBoot我們可以快速開發基于Spring生态下的應用程式。基于傳統的Spring架構開發web應用,我們需要做很多和業務無關并且隻需要做一個的配置,比如管理jar包依賴,web.xml,Dispatch-Servlet.xml,應用部署到web容器,第三方元件內建到SpringIoc容器中的配置項維護,而在SpringBoot中,我們不需要再去做這些繁瑣的配置,SpringBoot已經自動幫我們完成了,這就是約定優于配置思想的展現。
展現:
- SpringBoot starter啟動依賴,它能幫我們管理所有的jar包版本。
- SpringBoot的自動裝配機制的實作,通過掃描約定路徑下的spring.factories檔案來識别配置類,實作Bean的自動裝配。
- 如果目前應用依賴了springmvc相關的jar,那麼SpringBoot會自動内置Tomcat容器來運作web應用。
- 預設加載的配置檔案application.yml等等。
總結
等等,我還有句話要說,要記得做最燦爛的自己。