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

全國(guó)咨詢(xún)/投訴熱線:400-618-4000

SpringBoot自動(dòng)配置的原理是什么?

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

好口碑IT培訓(xùn)

自動(dòng)配置的核心就在@SpringBootApplication注解上,SpringBootApplication這個(gè)注解底層包含了3個(gè)注解,分別是:

   - @SpringBootConfiguration

   - @ComponentScan

   - @EnableAutoConfiguration

   - @EnableAutoConfiguration這個(gè)注解才是自動(dòng)配置的核心。

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

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

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

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

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

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

自定義starter分析案例

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

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

業(yè)務(wù)場(chǎng)景:

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

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

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

業(yè)務(wù)場(chǎng)景

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

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

Springboot

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

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

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

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

2. autoconfigure模塊(自動(dòng)配置)

將來(lái)在項(xiàng)目當(dāng)中進(jìn)行相關(guān)功能開(kāi)發(fā)時(shí),只需要引入一個(gè)起步依賴(lài)就可以了,因?yàn)樗鼤?huì)將autoconfigure自動(dòng)配置的依賴(lài)給傳遞下來(lái)。

上面我們簡(jiǎn)單介紹了自定義starter的場(chǎng)景,以及自定義starter時(shí)涉及到的模塊之后,接下來(lái)我們就來(lái)完成一個(gè)自定義starter的案例。

需求:自定義aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具類(lèi)AliyunOSSUtils的自動(dòng)配置。

目標(biāo):引入起步依賴(lài)引入之后,要想使用阿里云OSS,注入AliyunOSSUtils直接使用即可。

0 分享到:
和我們?cè)诰€交談!