91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot原理中自動配置機制是怎樣的

發布時間:2021-11-15 09:20:04 來源:億速云 閱讀:189 作者:柒染 欄目:開發技術

本篇文章為大家展示了SpringBoot原理中自動配置機制是怎樣的,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

    前言

    在當下的java生態里,SpringBoot已經成為事實上的開發標準,絕大多數人現在都是面向SpringBoot編程。SpringBoot是對Spring的進一步封裝,整合了分布式系統上下游所需的各種類庫和組件,并且實現了開箱即用,而這一切的底層基礎就是SpringBoot的自動配置機制。

    Spring配置類

    Spring引入配置類是為了:1)替換冗長繁瑣的配置文件,2)提供更靈活的bean定義方式。使用@Configuration注解去標記一個配置類,通過其中含有@Bean注解的方法去創建一個bean,如下代碼

    @Configuration
    public class HelloAutoConfiguration {
    
        @Bean
        HelloService helloService() {
            return new HelloService;
        }
    
    }

    即為一個簡單的配置類,并且定義了一個HelloService的bean。在此之上,Spring還提供了一套條件加載機制,可以去動態控制一個配置類是否被加載。通過實現org.springframework.context.annotation.Condition接口,開發者就可以自己控制配置類的加載條件,滿足很多復雜的場景

    SpringBoot自動配置

    介紹完了Spring的配置類,我們來看看SpringBoot是怎么利用這套機制去實現自動配置的。

    自動配置的概念

    首先,什么是自動配置?我們看一下SpringBoot對于自動配置類的定義:

    Auto-configuration classes are regular Spring @Configuration beans. They are located using the SpringFactoriesLoader mechanism (keyed against this class). Generally auto-configuration beans are @Conditional beans (most often using @ConditionalOnClass and @ConditionalOnMissingBeanannotations).

    自動配置類就是一個普通的@Configuration配置類,通常會帶有一些@Conditional條件注解,并且使用SpringFactoriesLoader機制去定位加載它們(并非都是如此,還有其他一些Spring固有的加載方式,比如通過@ComponentScan包掃描或者顯式@Import方式都可以讓它們被發現)。

    自動配置的運行機制

    加載方式

    自動配置機制的啟用是通過@EnableAutoConfiguration注解去控制的,因此需要在SpringBoot工程的入口類上啟用該注解,但是通常,我們一般使用@SpringBootApplication來代替,后者是一個注解的合集,包含了一些必要的默認配置,其中就有@EnableAutoConfiguration注解,其類的注釋上是這么描述的:

    Indicates a Configuration class that declares one or more @Bean methods and also triggers auto-configuration and component scanning. This is a convenience annotation that is equivalent to declaring @Configuration, @EnableAutoConfiguration and @ComponentScan.

    它本身既標識一個配置類,同時也開啟了自動配置和組件掃描。

    回到@EnableAutoConfiguration注解上,我們看一下該注解的定義

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import(AutoConfigurationImportSelector.class)
    public @interface EnableAutoConfiguration {
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    }

    其中@Import(AutoConfigurationImportSelector.class)是功能生效的關鍵,該注解導入了AutoConfigurationImportSelector組件到Spring環境中,開啟自動配置類的掃描加載工作,該類實現了接口org.springframework.context.annotation.ImportSelector

    public interface ImportSelector {
    
        /**
         * Select and return the names of which class(es) should be imported based on
         * the {@link AnnotationMetadata} of the importing @{@link Configuration} class.
         * @return the class names, or an empty array if none
         */
        String[] selectImports(AnnotationMetadata importingClassMetadata);
    
       ....其他省略
    }

    其中selectImports方法會在Spring啟動時被調用,用于返回所有的自動配置類,調用入口在org.springframework.context.annotation.ConfigurationClassParser類中,該類是Spring專門用來加載處理所有@Configuration配置類的,具體的加載細節,限于篇幅問題,就不在本文中展開說明了,讀者們可自行去閱讀源碼,本人也許會在后續再另開一篇詳細說明。接著說selectImports方法,我們來看一下自動配置類的加載過程,AutoConfigurationImportSelector對于該方法的具體實現為

    @Override
        public String[] selectImports(AnnotationMetadata annotationMetadata) {
            if (!isEnabled(annotationMetadata)) {
                return NO_IMPORTS;
            }
            AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }

    isEnabled方法是一個開關,用于控制是否啟用自動配置,邏輯很簡單,略過不提,往下看,關鍵邏輯在getAutoConfigurationEntry方法中,跟下去

    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
            if (!isEnabled(annotationMetadata)) {
                return EMPTY_ENTRY;
            }
            AnnotationAttributes attributes = getAttributes(annotationMetadata);
            List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
            configurations = removeDuplicates(configurations);
            Set<String> exclusions = getExclusions(annotationMetadata, attributes);
            checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = getConfigurationClassFilter().filter(configurations);
            fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationEntry(configurations, exclusions);
        }

    很容易看到加載邏輯在getCandidateConfigurations方法中,后續代碼是去重和過濾的過程,再往下看

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
            List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                    getBeanClassLoader());
            Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
                    + "are using a custom packaging, make sure that file is correct.");
            return configurations;
        }

    這個方法就很簡單明顯了,直接調用SpringFactoriesLoader去加載對應的內容,接下來我們再聊聊SpringFactoriesLoader機制是怎么回事。

    SpringFactoriesLoader機制

    SpringFactoriesLoader直譯過來就是工廠加載機制,是Spring仿照Java的SPI機制實現的一套類加載機制,通過讀取模塊內的META-INF/spring.factories文件來加載類,該文件為Properties格式,其中key部分是一個Class全限定名稱,可以是一個接口、抽象類或者注解等,而value部分是一個支持逗號分割的實現類列表,比如

    SpringBoot原理中自動配置機制是怎樣的

    而SpringFactoriesLoader就是Spring提供的一個用于讀取解析META-INF/spring.factories文件的工具類,通過傳入一個Class類型加載其對應的實現類列表。

    SpringFactoriesLoader如何應用在自動配置中

    介紹完了SpringFactoriesLoader,我們來研究一下SpringBoot的自動配置機制中是怎么使用它的,回到上面的getCandidateConfigurations方法中,我們看一下這一行

    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
                    getBeanClassLoader());

    其中第一個參數是key對應Class類型,第二個參數是用哪個ClassLoader去加載配置文件,我們看一下getSpringFactoriesLoaderFactoryClass這個方法返回的具體Class是什么

    protected Class<?> getSpringFactoriesLoaderFactoryClass() {
            return EnableAutoConfiguration.class;
        }

    很簡單,直接返回@EnableAutoConfiguration注解對應的class類型,那么自動配置類在META-INF/spring.factories文件中的配置方式就顯而易見了,上面截圖中最前面的部分

    # AutoConfiguration
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration,\
    org.springframework.cloud.autoconfigure.LifecycleMvcEndpointAutoConfiguration,\
    org.springframework.cloud.autoconfigure.RefreshAutoConfiguration,\
    org.springframework.cloud.autoconfigure.RefreshEndpointAutoConfiguration,\
    org.springframework.cloud.autoconfigure.WritableEnvironmentEndpointAutoConfiguration

    就是對應的自動配置類了。這些被配置在此處的類都會被作為自動配置類加載到Spring中,然后進行相應的處理,發揮出每個類的功能作用。

    上述內容就是SpringBoot原理中自動配置機制是怎樣的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    错那县| 金门县| 平乐县| 巨野县| 清原| 杨浦区| 祥云县| 商南县| 怀安县| 肇州县| 清流县| 西城区| 嘉义县| 孟村| 九龙坡区| 沙洋县| 沭阳县| 荣昌县| 壶关县| 周口市| 太谷县| 剑川县| 泗阳县| 凤冈县| 樟树市| 通海县| 新沂市| 壤塘县| 页游| 馆陶县| 休宁县| 宜春市| 莱州市| 清镇市| 临朐县| 时尚| 澄城县| 长岛县| 宝山区| 东乌| 宜都市|