日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

SpringBoot 自動配置原理

作者:Ran959 更新時間: 2022-09-05 編程語言

什么是 SpringBoot 自動裝配?

SpringBoot 定義了一套接口規范,這套規范規定:SpringBoot 在啟動時會掃描外部引用 jar 包中的META-INF/spring.factories文件,將文件中配置的類型信息加載到 Spring 容器(此處涉及到 JVM 類加載機制與 Spring 的容器知識),并執行類中定義的各種操作。對于外部 jar 來說,只需要按照 SpringBoot 定義的標準,就能將自己的功能裝置進 SpringBoot。

沒有 Spring Boot 的情況下,如果我們需要引入第三方依賴,需要手動配置,非常麻煩。但是,Spring Boot 中,我們直接引入一個 starter 即可。比如你想要在項目中使用 redis 的話,直接在項目中引入對應的 starter 即可。?

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

引入 starter 之后,我們通過少量注解和一些簡單的配置就能使用第三方組件提供的功能了。

在我看來,自動裝配可以簡單理解為:通過注解或者一些簡單的配置就能在 Spring Boot 的幫助下實現某塊功能。

SpringBoot 是如何實現自動裝配的?

我們先看一下 SpringBoot 的核心注解?SpringBootApplication

大概可以把?@SpringBootApplication看作是?@Configuration@EnableAutoConfiguration@ComponentScan?注解的集合。根據 SpringBoot 官網,這三個注解的作用分別是:

  • @EnableAutoConfiguration:啟用 SpringBoot 的自動配置機制

  • @Configuration:允許在上下文中注冊額外的 bean 或導入其他配置類

  • @ComponentScan: 掃描被@Component?(@Service,@Controller)注解的 bean,注解默認會掃描啟動類所在的包下所有的類 ,可以自定義不掃描某些 bean。

@EnableAutoConfiguration?是實現自動裝配的重要注解,我們以這個注解入手?:

EnableAutoConfiguration?只是一個簡單地注解,自動裝配核心功能的實現實際是通過?AutoConfigurationImportSelector類.

AutoConfigurationImportSelector類的繼承體系如下:

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {

}

public interface DeferredImportSelector extends ImportSelector {

}

public interface ImportSelector {
    String[] selectImports(AnnotationMetadata var1);
}

AutoConfigurationImportSelector?類實現了?ImportSelector接口,也就實現了這個接口中的?selectImports方法,該方法主要用于獲取所有符合條件的類的全限定類名,這些類需要被加載到 IoC 容器中。?

結合getAutoConfigurationEntry()的源碼

private static final AutoConfigurationEntry EMPTY_ENTRY = new AutoConfigurationEntry();

AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
        //<1>.
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            //<2>.
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            //<3>.
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            //<4>.
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.filter(configurations, autoConfigurationMetadata);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }

?總結:

Spring Boot 通過@EnableAutoConfiguration開啟自動裝配,通過 SpringFactoriesLoader 最終加載META-INF/spring.factories中的自動配置類實現自動裝配,自動配置類其實就是通過@Conditional按需加載的配置類,想要其生效必須引入spring-boot-starter-xxx包實現起步依賴

原文鏈接:https://blog.csdn.net/weixin_67588007/article/details/126334915

欄目分類
最近更新