SpringBoot系列之starter原理


前言

SpringBoot 除了提供自身的功能外,還為我們提供了眾多開箱即用的starter,比如常用的像

spring-boot-starter-jdbcspring-boot-starter-logging等。我們只要在 pom 文件中引入這些組件的依賴,springboot就會幫我們加載這些組件的 bean 到 IOC 容器中,並且允許我們對組件的一些配置進行定制,可謂是真正的“開箱即用”,這也是 springboot 現在稱為行業事實標准的一個重要原因。那這樣殺手鐧級別的特性是如何實現的呢?本文我們將探討這個話題。

依賴包什么都沒有?

我們以spring-boot-starter-jdbc2.0.3.RELEASE版本為例,去 maven 中央倉庫下載對應的 jar 包,地址:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc/2.0.3.RELEASE。點擊紅框內按鈕下載 jar 包:

image-20210606181054309

下載完解壓,發現 jar 包內沒有 class 文件,也沒有 pom.xml:

image-20210606181218985

spring.provides 在2.1.0之后的版本被去掉了,我們看下MANIFEST.MF文件:image-20210606181445762這里面只是一些介紹和環境信息,what?!不符合客觀規律啊,沒找到任何有價值的東西啊,那引入這個依賴的 jar 包有啥用呢?

再看依賴包

我們點擊右邊這個按鈕,打開所有的 jar 包看一下:

image-20210606182125191

image-20210606182140048

發現還有 source 的 jar 包。source 的 jar 包和普通的 jar 包區別在於 source 中包含 java 源代碼,而普通 jar 包中只有 class 文件,這一點在 jar 包大小上也能看出來,source 包是普通 jar 包的四倍左右大小。

我們下載 source 包看一下:

image-20210606182401621

Ohhhhhh!source 包里有 pom 文件,我們打開 pom 文件:image-20210606182508610

pom 文件中引入了三個與 Jdbc 有關的依賴,到這里我們大致清楚了:starter 依賴只負責引入相關的功能 jar 包,而不會主動的將 bean 注冊到 IOC 容器中。

至於為什么普通 jar 包中沒有 pom 文件,我猜測與 maven 的打包機制有關,可能是將 class 文件與 pom 文件分別打包,導致普通 jar 包中看不到 pom.xml。這個知識點屬於 maven 的范疇了,等研究 maven 的時候再寫文章告訴大家(基礎真的很重要)。

starter 與自動裝配

我們在上文中看到,starter 依賴只會幫我們引入對應功能的 jar 包,而沒有主動將 bean 注冊到 IOC 容器中(甚至連 class 文件都沒有)。那 springboot 是怎么做到“開箱即用”的呢?這就與springboot 的 AutoConfiguration 也就是自動裝配有關系了,關於自動裝配的內容在我的另一篇博文《SpringBoot系列之啟動流程3-自動裝配與@SpringBootApplication注解》中有詳細介紹。簡單來說就是 springboot 在 classpath 下搜索所有 jar 包中的 spring.factories文件,將其匯總為將要注冊進IOC 容器中的 bean 藍本。

加載完這些藍本類之后,不是直接注冊進 IOC 容器中,因為直接注冊的話太多了,光是注冊可能就要花很久,況且有些 bean 我這個應用可能根本用不到呢,那我就白花那么長時間啟動了。所以springboot還要借助條件裝配,看一下是否滿足條件,滿足的話才會進行相應功能的自動裝配,將相應的bean 注冊進 IOC 容器,否則忽略該自動裝配。

舉個實際的例子:AutoConfiguration =\ JdbcTemplateAutoConfiguration 也是自動裝配中的一項:image-20210606185008271

我們找到這個類看一下源碼:

image-20210606185934074

這個類上有一些注解,其中@ConditionalOnClass({ DataSource.class, JdbcTemplate.class })標識出:這個配置類只有在有DataSource.class和JdbcTemplate.class這兩個 class 文件的時候才生效,而jdbc-starter 的依賴包中,就包含這兩個類,所以JdbcTemplateAutoConfiguration才能自動裝配生效!

總結

starter 是 springboot 提供的開箱即用的組件,這些組件本身不提供主動注冊 Bean 的功能,而是向應用中引入依賴,后續 springboot 應用啟動,觸發自動裝配的時候,發現starter 引入的相關依賴,就會將對應功能的 bean 裝配進 IOC 容器中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM