教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

SpringBoot自動配置的原理是什么?

更新時間:2023年04月13日16時11分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

自動配置的核心就在@SpringBootApplication注解上,SpringBootApplication這個注解底層包含了3個注解,分別是:

   - @SpringBootConfiguration

   - @ComponentScan

   - @EnableAutoConfiguration

   - @EnableAutoConfiguration這個注解才是自動配置的核心。

- 它封裝了一個@Import注解,Import注解里面指定了一個ImportSelector接口的實現(xiàn)類。

在這個實現(xiàn)類中,重寫了ImportSelector接口中的selectImports()方法。而selectImports()方法中會去讀取兩份配置文件,并將配置文件中定義的配置類做為selectImports()方法的返回值返回,返回值代表的就是需要將哪些類交給Spring的IOC容器進行管理。

那么所有自動配置類的中聲明的bean都會加載到Spring的IOC容器中嗎? 其實并不會,因為這些配置類中在聲明bean時,通常都會添加@Conditional開頭的注解,這個注解就是進行條件裝配。而Spring會根據(jù)Conditional注解有選擇性的進行bean的創(chuàng)建。

@Enable 開頭的注解底層,它就封裝了一個注解 import 注解,它里面指定了一個類,是 ImportSelector 接口的實現(xiàn)類。在實現(xiàn)類當(dāng)中,我們需要去實現(xiàn) ImportSelector 接口當(dāng)中的一個方法 selectImports 這個方法。這個方法的返回值代表的就是我需要將哪些類交給 spring 的 IOC容器進行管理。

此時它會去讀取兩份配置文件,一份兒是 spring.factories,另外一份兒是 autoConfiguration.imports。而在 autoConfiguration.imports 這份兒文件當(dāng)中,它就會去配置大量的自動配置的類。

些所有的自動配置類當(dāng)中,所有的 bean都會加載到 spring 的 IOC 容器當(dāng)中嗎?其實并不會,因為這些配置類當(dāng)中,在聲明 bean 的時候,通常會加上這么一類@Conditional 開頭的注解。這個注解就是進行條件裝配。所以SpringBoot非常的智能,它會根據(jù) @Conditional 注解來進行條件裝配。只有條件成立,它才會聲明這個bean,才會將這個 bean 交給 IOC 容器管理。

自定義starter分析案例

下面我們就通過一個自定義starter案例來加深大家對于自動配置原理的理解。首先介紹一下自定義starter的業(yè)務(wù)場景,再來分析一下具體的操作步驟。

所謂starter指的就是SpringBoot當(dāng)中的起步依賴。在SpringBoot當(dāng)中已經(jīng)給我們提供了很多的起步依賴了,我們?yōu)槭裁催€需要自定義 starter 起步依賴?這是因為在實際的項目開發(fā)當(dāng)中,我們可能會用到很多第三方的技術(shù),并不是所有的第三方的技術(shù)官方都給我們提供了與SpringBoot整合的starter起步依賴,但是這些技術(shù)又非常的通用,在很多項目組當(dāng)中都在使用。

業(yè)務(wù)場景:

- 我們前面案例當(dāng)中所使用的阿里云OSS對象存儲服務(wù),現(xiàn)在阿里云的官方是沒有給我們提供對應(yīng)的起步依賴的,這個時候使用起來就會比較繁瑣,我們需要引入對應(yīng)的依賴。我們還需要在配置文件當(dāng)中進行配置,還需要基于官方SDK示例來改造對應(yīng)的工具類,我們在項目當(dāng)中才可以進行使用。

- 大家想在我們當(dāng)前項目當(dāng)中使用了阿里云OSS,我們需要進行這么多步的操作。在別的項目組當(dāng)中要想使用阿里云OSS,是不是也需要進行這么多步的操作,所以這個時候我們就可以自定義一些公共組件,在這些公共組件當(dāng)中,我就可以提前把需要配置的bean都提前配置好。將來在項目當(dāng)中,我要想使用這個技術(shù),我直接將組件對應(yīng)的坐標直接引入進來,就已經(jīng)自動配置好了,就可以直接使用了。我們也可以把公共組件提供給別的項目組進行使用,這樣就可以大大的簡化我們的開發(fā)。

在SpringBoot項目中,一般都會將這些公共組件封裝為SpringBoot當(dāng)中的starter,也就是我們所說的起步依賴。

業(yè)務(wù)場景

SpringBoot官方starter命名: spring-boot-starter-xxxx

第三組織提供的starter命名: xxxx-spring-boot-starter

Springboot

Mybatis提供了配置類,并且也提供了springboot會自動讀取的配置文件。當(dāng)SpringBoot項目啟動時,會讀取到spring.factories配置文件中的配置類并加載配置類,生成相關(guān)bean對象注冊到IOC容器中。

結(jié)果:我們可以直接在SpringBoot程序中使用Mybatis自動配置的bean對象。

在自定義一個起步依賴starter的時候,按照規(guī)范需要定義兩個模塊:

1. starter模塊(進行依賴管理[把程序開發(fā)所需要的依賴都定義在starter起步依賴中])

2. autoconfigure模塊(自動配置)

將來在項目當(dāng)中進行相關(guān)功能開發(fā)時,只需要引入一個起步依賴就可以了,因為它會將autoconfigure自動配置的依賴給傳遞下來。

上面我們簡單介紹了自定義starter的場景,以及自定義starter時涉及到的模塊之后,接下來我們就來完成一個自定義starter的案例。

需求:自定義aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具類AliyunOSSUtils的自動配置。

目標:引入起步依賴引入之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可。

0 分享到:
和我們在線交談!