SpringBoot 自动配置完整原理

SpringBoot 自动配置完整原理 SpringBoot 自动配置核心目的是无需手动写大量 XML / Bean 配置根据项目依赖、类是否存在、容器有无 Bean自动装配全套组件整套机制依托三大核心EnableAutoConfiguration、AutoConfigurationImportSelector、META-INF/spring.factories、条件注解。我分四层讲清楚完整流程。一、入口SpringBootApplication 复合注解SpringBootApplication Configuration ComponentScan EnableAutoConfiguration自动配置开关来自EnableAutoConfiguration核心逻辑全在这个注解里。 点进源码Import(AutoConfigurationImportSelector.class) public interface EnableAutoConfiguration {}Import导入选择器类这是自动配置的核心入口。二、核心类AutoConfigurationImportSelector自动配置选择器它实现了DeferredImportSelectorSpring 扫描配置类时会执行selectImports()方法核心做两件事读取所有 jar 包下资源文件META-INF/spring.factories在文件中查找 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.RedisAutoConfigurationSpringBoot 内置了上百个场景自动配置类数据库、MVC、Redis、Tomcat 全部在这里定义。三、条件注解按需生效避免无脑加载所有配置拿到所有自动配置类后不会全部直接加载每个配置类头部都带条件注解不满足条件直接跳过这是 “自动” 的关键。常用核心条件注解ConditionalOnClassclasspath 存在指定类才生效 例RedisAutoConfiguration 要求存在RedisTemplate类导入 spring-data-redis 依赖才会激活ConditionalOnMissingBean容器中没有用户自定义 Bean才自动创建 业务自己写了 DataSource则 SpringBoot 不会自动装配默认数据源ConditionalOnProperty配置文件存在对应配置项才开启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 RedisTemplateObject, Object redisTemplate(RedisConnectionFactory factory) { // 提供默认RedisTemplate } }流程引入 redis 依赖 → 存在 RedisTemplate 类业务没手动创建 RedisTemplate Bean自动配置生效容器自动注入 RedisTemplate直接 Autowired 使用。五、配置文件绑定EnableConfigurationProperties自动配置类配合EnableConfigurationProperties把 application.yml/properties 配置映射到属性类EnableConfigurationProperties(RedisProperties.class) public class RedisAutoConfiguration {}RedisProperties使用ConfigurationProperties(prefix spring.redis)读取 yml 中 redis 地址、端口、密码自动注入到 Redis 连接工厂无需手动读取配置文件。六、完整闭环流程串联所有步骤启动类加SpringBootApplication开启EnableAutoConfigurationImport(AutoConfigurationImportSelector)执行加载逻辑扫描所有 jar 包META-INF/spring.factories加载全部自动配置类列表逐个校验配置类上的条件注解过滤不满足条件的配置剩余生效的自动配置类作为配置类纳入 Spring 容器解析解析配置类中Bean方法自动创建组件 Bean通过ConfigurationProperties读取 yml 配置给组件注入参数若开发者自定义同名 BeanConditionalOnMissingBean使自动配置失效实现自定义覆盖默认配置。七、两大扩展点面试加分自定义 starter自己写 META-INF/spring.factories定义自定义 AutoConfiguration实现业务组件开箱即用遵循自动配置同一套规范排除指定自动配置启动注解排除不需要的自动类减少容器加载SpringBootApplication(exclude DataSourceAutoConfiguration.class)八、精简口述总结SpringBoot 自动配置由 EnableAutoConfiguration 驱动通过 AutoConfigurationImportSelector 读取各个 jar 的 spring.factories 文件获取所有自动配置类依靠 ConditionalOnClass、ConditionalOnMissingBean 等条件注解实现按需加载配置类内部使用 Bean 提供默认组件配合 ConfigurationProperties 读取 yml 配置用户自定义 Bean 可覆盖默认自动装配最终实现引入依赖即可开箱即用无需大量手动配置。