1. 程式人生 > 實用技巧 >SpringBoot - 自動裝配原理

SpringBoot - 自動裝配原理

1. 為何引入一些SpringBoot依賴的時候,不需要指定版本?

總結:

spring-boot-dependencies:作為父工程,存放了SpringBoot的核心依賴。我們在寫或者引入一些SpringBoot依賴的時候,不需要指定版本,正是因為SpringBoot的父依賴已經幫我們維護了一套版本。

細節:

SpringBoot的pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</
artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>

SpringBoot的專案都會存在一個父依賴,按住Ctrl+滑鼠左鍵,可以點進去 -->點進去之後發現裡面除了一些外掛和配置檔案的格式之外,還存在一個依賴spring-boot-dependencies

於是再點進去,可以發現裡面放了很多的依賴和依賴的版本號。

<parent>
    <
groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.1.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>

另外我們還可以看到,在父依賴中也幫我們寫好了資源庫,不用我們自己再去配置了。

<
resources> <resource> <filtering>true</filtering> <directory>${basedir}/src/main/resources</directory> <includes> <!-- 可以讀取的配置檔案有 application.yml/application.yaml/application.properties --> <include>**/application*.yml</include> <include>**/application*.yaml</include> <include>**/application*.properties</include> </includes> </resource> <resource> <directory>${basedir}/src/main/resources</directory> <excludes> <exclude>**/application*.yml</exclude> <exclude>**/application*.yaml</exclude> <exclude>**/application*.properties</exclude> </excludes> </resource> </resources>

2. 啟動器

啟動器就是SpringBoot的啟動場景,比如我們要使用web相關的,那麼就直接引入spring-boor-starter-web,那麼他就會幫我們自動匯入web環境下所有必需的依賴。

SpringBoot會將所有的功能場景都封裝成一個一個的啟動器,供開發人員使用。

3. SpringBoot主程式(重要)

3.1 總結

當我們的SpringBoot專案啟動的時候,會先匯入AutoConfigurationImportSelector,這個類會幫我們選擇所有候選的配置
我們需要匯入的配置都是SpringBoot幫我們寫好的一個一個的配置類,那麼這些配置類的位置,存在與spring-boot-autoconfigure的META-INF/spring.factories檔案中
通過這個檔案,Spring可以找到這些配置類的位置,於是去載入其中的配置。

3.2 @SpringBootApplication詳解

文字版本(重要,必看):https://zhuanlan.zhihu.com/p/95217578

@ConditionalOnClass

有些同學會存在疑問,spring.factories中存在那麼多的配置,每次啟動時都是把它們全量載入嗎?這顯然是不現實的。

@ConditionalOnXXX:如果其中的條件都滿足,該類才會生效(只要匯入相應的starter,條件就能成立)。所以在載入自動配置類的時候,並不是將spring.factories的配置全量載入進來,而是通過這個註解的判斷,如果註解中的類都存在,才會進行載入。

3.3 SpringApplicaton.run分析

記住1和4即可。

關於1:如果springboot專案引入了web依賴,就會被認定為web專案。如果沒有,就是普通專案,執行完就會終止。

關於4:run(XXX.class)的第一個引數,就是在定義哪個類是main方法的定義類