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