EnableAutoConfiguration自动配置底层原理
在spring框架中就提供了各種以@Enable開(kāi)頭的注解,例如: @EnableScheduling、@EnableCaching、@EnableMBeanExport等; @EnableAutoConfiguration的理念和做事方式其實(shí)一脈相承簡(jiǎn)單概括一下就是,借助@Import的支持,收集和注冊(cè)特定場(chǎng)景相關(guān)的bean定義。
舉例:
- @EnableScheduling是通過(guò)@Import將Spring調(diào)度框架相關(guān)的bean定義都加載到IoC容器【定時(shí)任務(wù)、時(shí)間調(diào)度任務(wù)】
- @EnableMBeanExport是通過(guò)@Import將JMX相關(guān)的bean定義加載到IoC容器【監(jiān)控JVM運(yùn)行時(shí)狀態(tài)】
其中最重要的兩個(gè)注解已經(jīng)標(biāo)注:1、@AutoConfigurationPackage?2、@Import(AutoConfigurationImportSelector.class)
當(dāng)然還有其中比較重要的一個(gè)類(lèi)就是:EnableAutoConfigurationImportSelector.class
1、@AutoConfigurationPackage**
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited@Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage {}@Import(AutoConfigurationPackages.Registrar.class)
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {register(registry, new PackageImport(metadata).getPackageName());}……}它其實(shí)是注冊(cè)了一個(gè)Bean的定義;
new PackageImport(metadata).getPackageName(),它其實(shí)返回了當(dāng)前主程序類(lèi)的同級(jí)以及子級(jí)的包組件(重點(diǎn));這也就是為什么,我們要把DemoApplication放在項(xiàng)目的最高級(jí)中。這就是約定大于配置
2. @Import({AutoConfigurationImportSelector.class})
EnableAutoConfigurationImportSelector:導(dǎo)入哪些組件的選擇器;
將所有需要導(dǎo)入的組件以全類(lèi)名的方式返回;這些組件就會(huì)被添加到容器中;
會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(lèi)(xxxAutoConfiguration);就是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件;有很多配置了@AutoConfiguration才會(huì)被自動(dòng)導(dǎo)入
Spring Boot在啟動(dòng)的時(shí)候從類(lèi)路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類(lèi)導(dǎo)入到容器中,自動(dòng)配置類(lèi)就生效,幫我們進(jìn)行自動(dòng)配置工作;以前我們需要自己配置的東西,自動(dòng)配置類(lèi)都幫我們;自動(dòng)配置器會(huì)跟根據(jù)傳入的factoryClass.getName()到項(xiàng)目系統(tǒng)路徑下所有的spring.factories文件中找到相應(yīng)的key,從而加載里面的類(lèi)。
自動(dòng)配置幕后英雄:SpringFactoriesLoader詳解
借助于Spring框架原有的一個(gè)工具類(lèi):SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自動(dòng)配置功效才得以大功告成!
SpringFactoriesLoader屬于Spring框架私有的一種擴(kuò)展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置,加載工廠類(lèi)。
就是解耦了,不再是源代碼寫(xiě)死的了,而是從classpath中搜尋所有的META-INF /spring.factories配置文件,并將其中org.springframework.boot.autoconfigure. EnableAutoConfiguration對(duì)應(yīng)的配置項(xiàng)通過(guò)反射(Java Refletion)實(shí)例化為對(duì)應(yīng)的標(biāo)注了@Configuration的JavaConfig形式的IoC容器配置類(lèi),然后匯總為一個(gè)并加載到IoC容器。
?
總結(jié)
以上是生活随笔為你收集整理的EnableAutoConfiguration自动配置底层原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: SpringBootApplicatio
- 下一篇: Controller 相关注解