天天看點

每日一練進擊大廠「DAY12」SpringBoot

作者:炯哈哈

文章目錄

  • 一、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的啟動類注解,它是一個複核注解,裡面包含

  1. @SpringBootConfiguration:該注解上有一個@Configuration注解,表示這個SpringBoot啟動類是一個配置類,最終要被注入到spring容器中
  2. @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啟動流程

  1. 加載配置檔案擷取所有實作SpringApplicationRunListener這個接口的監聽器調用監聽器中的starting方法
  2. 準備上下文環境
  3. 建立上下文環境
  4. 設定完環境變量會調用監聽器的相關方法
  5. 進入到spring啟動容器的方法servletWebServerApplicationContext類下的refresh方法
  6. 調用監聽器的started方法
  7. 計算springboot啟動時間
  8. 執行監聽器的ready方法
  9. 啟動完成

六、SpringBoot掃描流程

  1. 調用run方法中的refreshContext方法
  2. 調用AbstractApplication中的refresh方法
  3. 委托給invokeBeanFactoryPostProcessors去處理調用鍊
  4. 其中一個方法postProcessBeanDefinitionRegistry會去調用processConfigBeanDefinitions解析beandefinitions
  5. 在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等等。

總結

等等,我還有句話要說,要記得做最燦爛的自己。