硬核解析!Spring Boot 3.4 启动原理全揭秘,细节拉满!

开发 前端
理解 Spring Boot 的启动机制不仅能帮助开发者更高效地排查问题,还能在面对面试或架构设计时提供更强的技术支撑。Spring Boot 3.4 的自动化配置机制虽然复杂,但掌握其核心原理后,我们就可以更自由地扩展 Spring Boot 的能力,如自定义 Starter、优化应用性能等。​

Spring Boot 作为 Java 生态中的核心框架,已经彻底改变了 Java Web 开发的方式。它通过 "约定优于配置" 和强大的自动化配置能力,大幅提升了开发效率。然而,尽管 Spring Boot 被广泛使用,很多开发者在实际应用中只是停留在表层使用,而没有深入理解它的底层实现。例如,在面试或架构设计讨论中,Spring Boot 启动原理往往是考察点之一,但很多人对其核心机制了解不深。

本篇文章将带你深入剖析 Spring Boot 3.4 的启动流程,解析 @SpringBootApplication、@EnableAutoConfiguration 及其背后的自动化配置机制,帮助你构建对 Spring Boot 的深层次认知。

@SpringBootApplication 注解解析

要理解 Spring Boot 的自动化配置,必须先从 @SpringBootApplication 注解入手,它是整个 Spring Boot 启动过程的起点。先来看其源码:

@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{
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

该注解实际上是多个注解的组合:

  • @SpringBootConfiguration:标识该类为 Spring Boot 配置类。
  • @EnableAutoConfiguration:启用自动化配置(核心)。
  • @ComponentScan:自动扫描当前包及子包下的 Spring 组件。

其中,@EnableAutoConfiguration 是 Spring Boot 自动化配置的关键,我们接下来重点分析它的实现。

@EnableAutoConfiguration 的实现机制

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

这里的 @Import(AutoConfigurationImportSelector.class) 是关键,它会导入 AutoConfigurationImportSelector,进而加载各种自动化配置类。

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);
    }
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

该方法的核心作用是解析 AutoConfigurationImportSelector 并获取 AutoConfigurationEntry,最终将自动化配置类注册到 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);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

该方法执行了如下关键步骤:

  1. 通过 getCandidateConfigurations 方法获取所有候选自动化配置类。
  2. 过滤掉重复项,并移除 exclusions 中排除的配置类。
  3. 触发自动化配置导入事件。

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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

这里的自动化配置类来源有两个:

  1. META-INF/spring.factories 文件:用户自定义的 starter 会在这里声明自动化配置类。
  2. META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件:Spring Boot 内置的自动化配置类。

如果这两个地方都没有找到自动化配置类,将会抛出异常。

Spring Boot 3.4 启动机制总结

Spring Boot 3.4 的启动流程依赖于 @EnableAutoConfiguration 及其背后的 AutoConfigurationImportSelector 机制,核心原理如下:

  1. @SpringBootApplication 触发 @EnableAutoConfiguration 机制。
  2. @EnableAutoConfiguration 通过 AutoConfigurationImportSelector 解析并加载 META-INF/spring.factories 或 AutoConfiguration.imports 中定义的自动化配置类。
  3. 解析后的自动化配置类注册到 Spring 容器,完成自动配置。

结论

理解 Spring Boot 的启动机制不仅能帮助开发者更高效地排查问题,还能在面对面试或架构设计时提供更强的技术支撑。Spring Boot 3.4 的自动化配置机制虽然复杂,但掌握其核心原理后,我们就可以更自由地扩展 Spring Boot 的能力,如自定义 Starter、优化应用性能等。

责任编辑:武晓燕 来源: 路条编程
相关推荐

2025-03-26 01:25:00

Spring开发JSON

2019-11-15 15:12:19

Windows激活KMS

2010-03-03 13:43:46

Android手机系统

2024-12-03 10:46:48

Spring优化开发

2018-05-30 15:10:24

Spring BootList类型

2025-02-26 13:00:00

SpringBootJava开发

2023-09-27 08:14:56

2023-12-14 13:28:00

Spring流程Web

2025-02-13 07:45:26

APISpringHTTP

2021-09-13 09:40:35

Webpack 前端HMR 原理

2023-06-02 16:24:46

SpringBootSSM

2024-12-16 08:10:00

Spring开发

2014-09-18 10:29:37

APTAPT攻击组织Pitty Tiger

2025-03-13 00:25:00

SpringJava浏览器

2021-06-09 08:50:39

C语言关机代码复杂代码解读

2024-05-17 10:10:59

Web容器Undertow

2024-01-12 17:06:50

字节面试题目

2023-04-17 23:49:09

开发代码Java

2025-03-26 03:00:00

点赞
收藏

51CTO技术栈公众号