詳細(xì)SpringBoot框架教程——SpringBoot自動(dòng)配置原理

本篇文章主要內(nèi)容
SpringBoot自動(dòng)配置原理
Spring Boot中如何自定義starter?
視頻觀看戳??????

SpringBoot自動(dòng)配置原理
SpringBoot自動(dòng)配置原理(也叫 SpringBoot自動(dòng)裝配原理,SpringBoot starter原理)
流程圖:
https://www.processon.com/view/link/5efc4ffa6376891e81f3895d
在編寫(xiě)SpringBoot項(xiàng)目時(shí),入口類(lèi)上都會(huì)使用@SpringBootApplication注解了,我們可以看一下源代碼

1、@SpringBootApplication
我們先來(lái)看該注解本身,它本身還可以指定如下屬性:
exclude :?排除指定的類(lèi),比如:
@SpringBootApplication(exclude =?
RedisAutoConfiguration.class)
可以排除自定義配置等等,根據(jù)自己的需要進(jìn)行定制;
excludeName:排除指定的類(lèi)名,通過(guò)bean name來(lái)進(jìn)行排除指定的類(lèi),如下:
@SpringBootApplication(excludeName = "org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration")
scanBasePackages: 掃描指定的包添加到Spring容器中,參數(shù)為數(shù)組類(lèi)型:
@SpringBootApplication(scanBasePackages="com.bjpowernode.boot.component")
掃描的包能注冊(cè)識(shí)別,沒(méi)有掃描的包將不能注冊(cè)識(shí)別;
scanBasePackageClasses: 掃描指定包的類(lèi)并添加到Spring容器中,參數(shù)為Class類(lèi)型數(shù)組格式:
@SpringBootApplication(scanBasePackageClasses=MyComponent.class)
注冊(cè)的類(lèi)能識(shí)別,在同級(jí)包下或子包下的都能注冊(cè),否則不能識(shí)別;
@SpringBootApplication注解本身又是一個(gè)復(fù)合注解,它等效于如下四個(gè)注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@ConfigurationPropertiesScan
@SpringBootConfiguration
該注解等效于@Configuration,那也就是說(shuō)這個(gè)注解相當(dāng)于@Configuration,所以這兩個(gè)注解作用是一樣的,它是讓我們能夠去注冊(cè)一些額外的Bean,或者導(dǎo)入一些額外的配置,@Configuration還表示該類(lèi)是一個(gè)配置類(lèi),不需要額外的xml進(jìn)行配置,同時(shí)該類(lèi)也是Spring容器中的一個(gè)bean。
@EnableAutoConfiguration?(重點(diǎn))
該注解是Spring Boot自動(dòng)配置注解,Spring Boot中的自動(dòng)配置主要是@EnableAutoConfiguration的功勞,該注解可以讓Spring Boot根據(jù)類(lèi)路徑中的jar包依賴為當(dāng)
前項(xiàng)目進(jìn)行自動(dòng)配置,該注解由如下兩個(gè)注解構(gòu)成:
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)?
@AutoConfigurationPackage
讓包中的類(lèi)以及子包中的類(lèi)能夠被自動(dòng)掃描到Spring容器中;
@Import(AutoConfigurationPackages.Registrar.class)
register(registry, new?
PackageImport(metadata).getPackageName());
@Import注解,這個(gè)注解就是通過(guò)import的方式將bean添加到Spring容器中;
接下來(lái)我們重點(diǎn)看看注解:
@EnableAutoConfiguration
這是Spring Boot自動(dòng)配置的核心注解;
Spring框架本身也提供了幾個(gè)名字為@Enable開(kāi)頭的Annotation定義。比如@EnableScheduling、@EnableCaching等,@EnableAutoConfiguration的理念和這些注解其實(shí)是一脈相承的。
@EnableAutoConfiguration是借助@Import的幫助,將所有符合自動(dòng)配置條件的bean定義加載到IoC容器;

該注解通過(guò)@Import注解導(dǎo)入了一個(gè)組件:AutoConfigurationImportSelector,該組件實(shí)現(xiàn)了接口:
public interface DeferredImportSelector extends ImportSelector
該接口主要是為了導(dǎo)入@Configuration的配置項(xiàng);



會(huì)調(diào)用getCandidateConfigurations方法:



在這里遇到我們熟悉的SpringFactoryiesLoader, 它會(huì)讀取META-INF/spring.factories下的EnableAutoConfiguration的配置,緊接著在進(jìn)行排除與過(guò)濾,進(jìn)而得到需要裝配的類(lèi);


? ??

@EnableAutoConfiguration與@Conditional
@EnableAutoConfiguration自動(dòng)加載配置,@Conditional根據(jù)環(huán)境決定是否解析處理配置,這兩個(gè)注解的配合完成了自動(dòng)化配置功能;
Spring Boot中如何自定義starter?
1、寫(xiě)一個(gè)starter項(xiàng)目,一般是一個(gè)空殼,里面不寫(xiě)代碼,主要是起到依賴其他項(xiàng)目的作用;
2、寫(xiě)一個(gè)真正的實(shí)現(xiàn)自動(dòng)裝配邏輯的項(xiàng)目,在項(xiàng)目classpath下寫(xiě)一個(gè)META-INF/spring.factories文件;
3、在spring.factories中添加配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration =
com.bjpowernode.xxxConfiguration(該類(lèi)我們自己去實(shí)現(xiàn),里面主要是要做自動(dòng)化的配置,給使用者把該配的配置好,讓別人可以直接使用)
4、xxxConfiguration類(lèi)需要添加注解@Configuration;
5、xxxConfiguration類(lèi)一般也會(huì)使用@Conditional來(lái)適應(yīng)不同的環(huán)境;
6、在xxxConfiguration類(lèi)中實(shí)現(xiàn)自動(dòng)化配置;
有了SpringBoot的自動(dòng)化配置,我們可以靈活的自定義我們自己的自動(dòng)配置,當(dāng)應(yīng)用需要該功能時(shí),只需要簡(jiǎn)單的依賴該starter即可,同時(shí)Spring Boot為我們提供的條件注解,同樣的代碼可以靈活適應(yīng)各種環(huán)境;
如果想更深入的學(xué)習(xí)springboot,奉上springboot全套視頻教程,視頻學(xué)習(xí)效果更佳,走過(guò)路過(guò)別忘素質(zhì)三連哦~~

