最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自動配置的核心注解原理解析

 更新時間:2025年08月25日 10:43:27   作者:寒士obj  
自動配置在面試和日常使用中都是一個高頻話題,了解其原理對于深入掌握Spring Boot至關(guān)重要,這篇文章主要介紹了SpringBoot自動配置的核心注解原理的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

前言

SpringBoot作為Spring生態(tài)系統(tǒng)中的重要組成部分,其最大的特色就是約定優(yōu)于配置的設(shè)計理念,而自動配置機制正是這一理念的核心體現(xiàn)。通過自動配置,SpringBoot能夠根據(jù)項目中的依賴和配置,自動裝配相應(yīng)的Bean,極大地簡化了傳統(tǒng)Spring項目的配置工作。

SpringBoot自動配置概述

SpringBoot自動配置是一套智能化的配置機制,它能夠根據(jù)classpath中存在的jar包、配置文件中的屬性值以及其他條件,自動為應(yīng)用程序配置相應(yīng)的Bean。這種機制讓開發(fā)者無需編寫大量的XML配置文件或Java配置類,就能快速搭建一個功能完整的Spring應(yīng)用。自動配置的核心思想是通過條件注解來判斷是否需要創(chuàng)建某個Bean。只有當特定條件滿足時,相應(yīng)的配置類才會生效,Bean才會被創(chuàng)建并加入到Spring容器中。

自動配置的核心注解

@SpringBootApplication注解

SpringBoot應(yīng)用的入口點通常標注有@SpringBootApplication注解,這個注解是一個復(fù)合注解,包含了三個重要的注解:

其中@EnableAutoConfiguration是自動配置的核心注解,它負責(zé)啟動SpringBoot的自動配置機制。

@EnableAutoConfiguration注解解析

@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導(dǎo)入了AutoConfigurationImportSelector類,這個類是自動配置機制的核心實現(xiàn)。

AutoConfigurationImportSelector核心實現(xiàn)

AutoConfigurationImportSelector類實現(xiàn)了ImportSelector接口,Spring容器會調(diào)用其selectImports方法來獲取需要導(dǎo)入的配置類。

selectImports方法分析

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

這個方法首先檢查自動配置是否啟用,然后調(diào)用getAutoConfigurationEntry方法獲取自動配置條目。

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);
}

這個方法的執(zhí)行流程包括以下幾個步驟:

  1. 獲取候選配置類列表
  2. 移除重復(fù)的配置類
  3. 獲取排除的配置類
  4. 檢查排除的配置類是否合法
  5. 從候選配置中移除排除的配置
  6. 通過過濾器進一步篩選配置類
  7. 觸發(fā)自動配置導(dǎo)入事件


    其實主要的就是getCandidateConfigurationsfilter方法,一個是來得到配置類的List集合,另一個是用來對過濾不符合條件注解的那些配置類。

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.loadFactoryNames方法從META-INF/spring.factories文件中加載所有的自動配置類。

SpringFactoriesLoader機制

SpringFactoriesLoader是SpringBoot中一個重要的工具類,它負責(zé)從classpath下的META-INF/spring.factories文件中加載配置信息。

loadFactoryNames方法實現(xiàn)

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    ClassLoader classLoaderToUse = classLoader;
    if (classLoaderToUse == null) {
        classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
    }
    String factoryTypeName = factoryType.getName();
    return loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
}

loadSpringFactories方法核心邏輯

通過SpringFactoriesLoader來加載META-INF/spring.factories文件中的所有自動配置類,并將其緩存起來。

spring.factories文件格式

spring.factories文件采用Properties格式,其中key是接口或抽象類的全限定名,value是實現(xiàn)類的全限定名列表。以spring-boot-autoconfigure包中的spring.factories為例:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
...

條件注解機制

SpringBoot自動配置的智能之處在于條件注解的使用。這些注解決定了配置類在什么條件下才會生效。

自動配置的執(zhí)行流程

SpringBoot自動配置的完整執(zhí)行流程可以概括為以下幾個階段:

  1. 首先是啟動階段。當Spring容器啟動時,會處理@SpringBootApplication注解,進而處理@EnableAutoConfiguration注解。
  2. 然后是加載階段。AutoConfigurationImportSelector被調(diào)用,從META-INF/spring.factories文件中加載所有候選的自動配置類。
  3. 接下來是過濾階段。通過各種條件注解對候選的配置類進行過濾,只保留滿足條件的配置類。
  4. 最后是實例化階段。Spring容器實例化通過過濾的配置類,并創(chuàng)建相應(yīng)的Bean。

總結(jié)

SpringBoot的自動配置機制通過條件注解、SpringFactoriesLoader、META-INF/spring.factories文件等技術(shù),實現(xiàn)了智能化的Bean配置。它大大簡化了Spring應(yīng)用的配置工作,理解自動配置的原理不僅有助于更好地使用SpringBoot,也能幫助我們在必要時創(chuàng)建自己的自動配置,提高開發(fā)效率。

到此這篇關(guān)于SpringBoot自動配置的核心注解原理的文章就介紹到這了,更多相關(guān)SpringBoot自動配置原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

日喀则市| 新龙县| 龙口市| 南漳县| 泰安市| 上杭县| 淮滨县| 铜山县| 永和县| 皮山县| 福贡县| 芦山县| 汝阳县| 吉水县| 永胜县| 上杭县| 海晏县| 上思县| 盱眙县| 南宫市| 神木县| 青川县| 塘沽区| 荔浦县| 灌云县| 永新县| 潮安县| 青龙| 鄂伦春自治旗| 镇康县| 霍城县| 巴里| 罗平县| 龙山县| 平昌县| 峨眉山市| 高雄市| 特克斯县| 吉安县| 东宁县| 汉寿县|