SpringBoot 自动配置完整原理

📅 2026/7/19 15:18:07 👁️ 阅读次数 📝 编程学习
SpringBoot 自动配置完整原理

SpringBoot 自动配置核心目的是无需手动写大量 XML / @Bean 配置,根据项目依赖、类是否存在、容器有无 Bean,自动装配全套组件,整套机制依托三大核心:@EnableAutoConfigurationAutoConfigurationImportSelectorMETA-INF/spring.factories、条件注解。我分四层讲清楚完整流程。

一、入口:@SpringBootApplication 复合注解

@SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration

自动配置开关来自@EnableAutoConfiguration,核心逻辑全在这个注解里。 点进源码:

@Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {}

@Import导入选择器类,这是自动配置的核心入口。

二、核心类:AutoConfigurationImportSelector(自动配置选择器)

它实现了DeferredImportSelector,Spring 扫描配置类时会执行selectImports()方法,核心做两件事:

  1. 读取所有 jar 包下资源文件:META-INF/spring.factories
  2. 在文件中查找 key =org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的所有自动配置类全类名;

示例 spring.factories 片段:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\ org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration

SpringBoot 内置了上百个场景自动配置类,数据库、MVC、Redis、Tomcat 全部在这里定义。

三、条件注解:按需生效,避免无脑加载所有配置

拿到所有自动配置类后,不会全部直接加载,每个配置类头部都带条件注解,不满足条件直接跳过,这是 “自动” 的关键。

常用核心条件注解:

  1. @ConditionalOnClass:classpath 存在指定类才生效 例:RedisAutoConfiguration 要求存在RedisTemplate类,导入 spring-data-redis 依赖才会激活;
  2. @ConditionalOnMissingBean:容器中没有用户自定义 Bean,才自动创建 业务自己写了 DataSource,则 SpringBoot 不会自动装配默认数据源;
  3. @ConditionalOnProperty:配置文件存在对应配置项才开启;
  4. @ConditionalOnWebApplication:仅 web 环境生效(MVC 自动配置);

举个例子:WebMvcAutoConfiguration 只有项目引入 Servlet、Tomcat 依赖,满足@ConditionalOnClass(DispatcherServlet.class),才会自动装配视图解析器、静态资源映射、转换器等 MVC 组件。

四、自动配置类内部逻辑

每个 XXAutoConfiguration 都是标准@Configuration配置类,内部通过@Bean注册组件:

@Configuration @ConditionalOnClass(RedisTemplate.class) @ConditionalOnMissingBean(RedisTemplate.class) public class RedisAutoConfiguration { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) { // 提供默认RedisTemplate } }

流程:

  1. 引入 redis 依赖 → 存在 RedisTemplate 类;
  2. 业务没手动创建 RedisTemplate Bean;
  3. 自动配置生效,容器自动注入 RedisTemplate,直接 @Autowired 使用。

五、配置文件绑定:@EnableConfigurationProperties

自动配置类配合@EnableConfigurationProperties,把 application.yml/properties 配置映射到属性类:

@EnableConfigurationProperties(RedisProperties.class) public class RedisAutoConfiguration {}

RedisProperties使用@ConfigurationProperties(prefix = "spring.redis"),读取 yml 中 redis 地址、端口、密码,自动注入到 Redis 连接工厂,无需手动读取配置文件。

六、完整闭环流程(串联所有步骤)

  1. 启动类加@SpringBootApplication,开启@EnableAutoConfiguration
  2. @Import(AutoConfigurationImportSelector)执行加载逻辑;
  3. 扫描所有 jar 包META-INF/spring.factories,加载全部自动配置类列表;
  4. 逐个校验配置类上的条件注解,过滤不满足条件的配置;
  5. 剩余生效的自动配置类作为配置类纳入 Spring 容器解析;
  6. 解析配置类中@Bean方法,自动创建组件 Bean;
  7. 通过@ConfigurationProperties读取 yml 配置,给组件注入参数;
  8. 若开发者自定义同名 Bean,@ConditionalOnMissingBean使自动配置失效,实现自定义覆盖默认配置。

七、两大扩展点(面试加分)

  1. 自定义 starter自己写 META-INF/spring.factories,定义自定义 AutoConfiguration,实现业务组件开箱即用,遵循自动配置同一套规范;
  2. 排除指定自动配置启动注解排除不需要的自动类,减少容器加载:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

八、精简口述总结

SpringBoot 自动配置由 @EnableAutoConfiguration 驱动,通过 AutoConfigurationImportSelector 读取各个 jar 的 spring.factories 文件获取所有自动配置类;依靠 @ConditionalOnClass、@ConditionalOnMissingBean 等条件注解实现按需加载;配置类内部使用 @Bean 提供默认组件,配合 @ConfigurationProperties 读取 yml 配置;用户自定义 Bean 可覆盖默认自动装配,最终实现引入依赖即可开箱即用,无需大量手动配置。