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