自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

硬核解析!Spring Boot 3.4 啟動(dòng)原理全揭秘,細(xì)節(jié)拉滿(mǎn)!

開(kāi)發(fā) 前端
理解 Spring Boot 的啟動(dòng)機(jī)制不僅能幫助開(kāi)發(fā)者更高效地排查問(wèn)題,還能在面對(duì)面試或架構(gòu)設(shè)計(jì)時(shí)提供更強(qiáng)的技術(shù)支撐。Spring Boot 3.4 的自動(dòng)化配置機(jī)制雖然復(fù)雜,但掌握其核心原理后,我們就可以更自由地?cái)U(kuò)展 Spring Boot 的能力,如自定義 Starter、優(yōu)化應(yīng)用性能等。?

Spring Boot 作為 Java 生態(tài)中的核心框架,已經(jīng)徹底改變了 Java Web 開(kāi)發(fā)的方式。它通過(guò) "約定優(yōu)于配置" 和強(qiáng)大的自動(dòng)化配置能力,大幅提升了開(kāi)發(fā)效率。然而,盡管 Spring Boot 被廣泛使用,很多開(kāi)發(fā)者在實(shí)際應(yīng)用中只是停留在表層使用,而沒(méi)有深入理解它的底層實(shí)現(xiàn)。例如,在面試或架構(gòu)設(shè)計(jì)討論中,Spring Boot 啟動(dòng)原理往往是考察點(diǎn)之一,但很多人對(duì)其核心機(jī)制了解不深。

本篇文章將帶你深入剖析 Spring Boot 3.4 的啟動(dòng)流程,解析 @SpringBootApplication、@EnableAutoConfiguration 及其背后的自動(dòng)化配置機(jī)制,幫助你構(gòu)建對(duì) Spring Boot 的深層次認(rèn)知。

@SpringBootApplication 注解解析

要理解 Spring Boot 的自動(dòng)化配置,必須先從 @SpringBootApplication 注解入手,它是整個(gè) Spring Boot 啟動(dòng)過(guò)程的起點(diǎn)。先來(lái)看其源碼:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters ={
    @Filter(type =FilterType.CUSTOM, classes =TypeExcludeFilter.class),
    @Filter(type =FilterType.CUSTOM, classes =AutoConfigurationExcludeFilter.class)
})
public@interfaceSpringBootApplication{
}

該注解實(shí)際上是多個(gè)注解的組合:

  • @SpringBootConfiguration:標(biāo)識(shí)該類(lèi)為 Spring Boot 配置類(lèi)。
  • @EnableAutoConfiguration:?jiǎn)⒂米詣?dòng)化配置(核心)。
  • @ComponentScan:自動(dòng)掃描當(dāng)前包及子包下的 Spring 組件。

其中,@EnableAutoConfiguration 是 Spring Boot 自動(dòng)化配置的關(guān)鍵,我們接下來(lái)重點(diǎn)分析它的實(shí)現(xiàn)。

@EnableAutoConfiguration 的實(shí)現(xiàn)機(jī)制

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

這里的 @Import(AutoConfigurationImportSelector.class) 是關(guān)鍵,它會(huì)導(dǎo)入 AutoConfigurationImportSelector,進(jìn)而加載各種自動(dòng)化配置類(lèi)。

AutoConfigurationImportSelector 解析

@Override
public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {
    Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,
        () -> String.format("Only %s implementations are supported, got %s",
            AutoConfigurationImportSelector.class.getSimpleName(),
            deferredImportSelector.getClass().getName()));


    AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
        .getAutoConfigurationEntry(annotationMetadata);
    this.autoConfigurationEntries.add(autoConfigurationEntry);


    for (String importClassName : autoConfigurationEntry.getConfigurations()) {
        this.entries.putIfAbsent(importClassName, annotationMetadata);
    }
}

該方法的核心作用是解析 AutoConfigurationImportSelector 并獲取 AutoConfigurationEntry,最終將自動(dòng)化配置類(lèi)注冊(cè)到 Spring 容器中。

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í)行了如下關(guān)鍵步驟:

  1. 通過(guò) getCandidateConfigurations 方法獲取所有候選自動(dòng)化配置類(lèi)。
  2. 過(guò)濾掉重復(fù)項(xiàng),并移除 exclusions 中排除的配置類(lèi)。
  3. 觸發(fā)自動(dòng)化配置導(dǎo)入事件。

getCandidateConfigurations 方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = new ArrayList<>(
        SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
    ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);


    Assert.notEmpty(configurations,
        "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you " +
            "are using a custom packaging, make sure that file is correct.");


    return configurations;
}

這里的自動(dòng)化配置類(lèi)來(lái)源有兩個(gè):

  1. META-INF/spring.factories 文件:用戶(hù)自定義的 starter 會(huì)在這里聲明自動(dòng)化配置類(lèi)。
  2. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件:Spring Boot 內(nèi)置的自動(dòng)化配置類(lèi)。

如果這兩個(gè)地方都沒(méi)有找到自動(dòng)化配置類(lèi),將會(huì)拋出異常。

Spring Boot 3.4 啟動(dòng)機(jī)制總結(jié)

Spring Boot 3.4 的啟動(dòng)流程依賴(lài)于 @EnableAutoConfiguration 及其背后的 AutoConfigurationImportSelector 機(jī)制,核心原理如下:

  1. @SpringBootApplication 觸發(fā) @EnableAutoConfiguration 機(jī)制。
  2. @EnableAutoConfiguration 通過(guò) AutoConfigurationImportSelector 解析并加載 META-INF/spring.factories 或 AutoConfiguration.imports 中定義的自動(dòng)化配置類(lèi)。
  3. 解析后的自動(dòng)化配置類(lèi)注冊(cè)到 Spring 容器,完成自動(dòng)配置。

結(jié)論

理解 Spring Boot 的啟動(dòng)機(jī)制不僅能幫助開(kāi)發(fā)者更高效地排查問(wèn)題,還能在面對(duì)面試或架構(gòu)設(shè)計(jì)時(shí)提供更強(qiáng)的技術(shù)支撐。Spring Boot 3.4 的自動(dòng)化配置機(jī)制雖然復(fù)雜,但掌握其核心原理后,我們就可以更自由地?cái)U(kuò)展 Spring Boot 的能力,如自定義 Starter、優(yōu)化應(yīng)用性能等。

責(zé)任編輯:武曉燕 來(lái)源: 路條編程
相關(guān)推薦

2025-03-26 01:25:00

Spring開(kāi)發(fā)JSON

2019-11-15 15:12:19

Windows激活KMS

2010-03-03 13:43:46

Android手機(jī)系統(tǒng)

2025-04-16 10:03:40

開(kāi)發(fā)Spring應(yīng)用程序

2024-12-03 10:46:48

Spring優(yōu)化開(kāi)發(fā)

2023-09-27 08:14:56

2018-05-30 15:10:24

Spring BootList類(lèi)型

2025-02-26 13:00:00

SpringBootJava開(kāi)發(fā)

2023-12-14 13:28:00

Spring流程Web

2025-04-07 03:00:00

SpringBoot數(shù)據(jù)庫(kù)

2025-02-13 07:45:26

APISpringHTTP

2023-06-02 16:24:46

SpringBootSSM

2024-12-16 08:10:00

Spring開(kāi)發(fā)

2021-09-13 09:40:35

Webpack 前端HMR 原理

2025-03-13 00:25:00

SpringJava瀏覽器

2021-06-09 08:50:39

C語(yǔ)言關(guān)機(jī)代碼復(fù)雜代碼解讀

2014-09-18 10:29:37

APTAPT攻擊組織Pitty Tiger

2024-05-17 10:10:59

Web容器Undertow

2024-01-12 17:06:50

字節(jié)面試題目
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)