Skip to content

05.1 — 自动配置原理

Spring Boot 的核心思想是"约定优于配置"(Convention over Configuration),通过自动配置大幅简化 Spring 应用的搭建。

← 返回 **Spring Boot 索引**


1. @SpringBootApplication 组合注解

java
@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 @interface SpringBootApplication {
    // ...
}

这三大注解的功能:

注解作用
@SpringBootConfiguration本质是 @Configuration,标明是配置类
@EnableAutoConfiguration核心,开启自动配置机制
@ComponentScan包扫描,默认扫描启动类所在包及其子包

2. 自动配置原理

自动配置加载过程

第一步@EnableAutoConfiguration 导入 AutoConfigurationImportSelector

第二步AutoConfigurationImportSelector.selectImports() 加载所有候选自动配置类

第三步(Spring Boot 2.7+):从 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 读取

# 文件内容示例(每行一个自动配置类全限定名)
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

第四步:对每个自动配置类进行条件评估(@ConditionalOnXxx),满足条件才注册 Bean

spring.factories vs AutoConfiguration.imports

版本文件路径说明
Spring Boot 2.7 之前META-INF/spring.factories使用 SpringFactoriesLoader 加载
Spring Boot 2.7+META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports专用文件,启动更快

为什么迁移?spring.factories 是通用 SPI 文件被各种组件共享加载,移除自动配置项可以减少类路径扫描,提升启动速度。


常见面试题

  1. @SpringBootApplication 由哪些注解组成?各自的作用?
  2. 自动配置的实现原理?spring.factories 和 AutoConfiguration.imports 有何区别?
  3. Spring Boot 2.x 和 3.x 在自动配置上有什么变化?

← 返回 **Spring Boot 索引**

Knowledge4J — Java 知识库