Spring Boot - 自动配置原理

Spring Boot 核心 —— 自动配置原理

1. 核心思想:约定优于配置

Spring Boot 的设计哲学是“约定优于配置” (Convention over Configuration)。它旨在尽可能快地、最小化配置地创建出独立的、生产级的 Spring 应用。

  • Spring Framework: 像一大堆乐高积木,灵活但费力。
  • Spring Boot: 像一个乐高套装,附带说明书(自动配置),让你快速搭建出完整模型。

自动配置是 Spring Boot 最核心的特性,它的工作原理可以总结为“启动、加载、筛选、生效”四个步骤。


2. 自动配置的四个核心步骤

第一步:启动 -> @SpringBootApplication 注解

这一切都始于主启动类上的 @SpringBootApplication 注解。它其实是一个复合注解,主要由三个更小的注解组成:

  1. @SpringBootConfiguration:表明这是一个 Spring Boot 的配置类,本质上就是 @Configuration
  2. @ComponentScan:启用组件扫描,让 Spring 去发现我们自己定义的 Bean(比如 @Service, @Controller 等)。
  3. @EnableAutoConfiguration:这是自动配置的核心开关

第二步:加载 -> @EnableAutoConfigurationspring.factories

@EnableAutoConfiguration 注解通过 @Import 导入了 AutoConfigurationImportSelector 这个类。这个类的核心作用就是:

  1. 扫描 Jar 包:它会去扫描应用 classpath 下所有 jar 包中的 META-INF/spring.factories 文件。(在 Spring Boot 2.7+ 版本中,这个文件是 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)。
  2. 收集配置类:在这些文件中,它会找到以 org.springframework.boot.autoconfigure.EnableAutoConfiguration 作为 Key 的配置项,这个 Key 下面定义了所有需要被自动配置的类的完整路径名,比如 DataSourceAutoConfigurationWebMvcAutoConfiguration 等。

AutoConfigurationImportSelector 会把这些类的名字都收集起来,形成一个自动配置类的“候选名单”。

第三步:筛选 -> @Conditional 条件注解

Spring Boot 并不会加载所有候选的自动配置类,而是会通过一系列的 @Conditional 条件注解来进行智能筛选。这些注解就像一个个“开关”,只有满足特定条件,对应的自动配置类才会生效。

最常见的条件注解有:

  • @ConditionalOnClass: 判断 classpath 中是否存在某个类。

    • 场景DataSourceAutoConfiguration 上有 @ConditionalOnClass(DataSource.class)。只有当你引入了数据库驱动(如 mysql-connector-java),classpath 里才会有 DataSource 这个类,Spring Boot 才会去尝试帮你自动配置数据源。
  • @ConditionalOnMissingBean: 判断容器中是否存在某个类型的 Bean。

    • 场景:在 DataSourceAutoConfiguration 内部,定义 DataSource Bean 的方法上就有 @ConditionalOnMissingBean(DataSource.class)。这意味着,如果你自己手动配置了一个 DataSource Bean,那 Spring Boot 的自动配置就会自动“退让”,使用你定义的 Bean。这完美体现了“约定优于配置”的思想。
  • 其他常用条件:

    • @ConditionalOnProperty:判断配置文件中是否有某个属性。
    • @ConditionalOnWebApplication:判断当前是否是 Web 环境。

第四步:生效 -> 装配 Bean

经过 @Conditional 注解的层层筛选后,最终“存活”下来的自动配置类才会被 Spring IoC 容器加载。容器会实例化这些配置类,并执行其中的 @Bean 方法,将一个个配置好的 Bean(比如 DataSource, JdbcTemplate, DispatcherServlet 等)装配到容器中,至此,自动配置完成。


3. 总结:完整的流程

@SpringBootApplication 触发 -> @EnableAutoConfiguration 生效 -> AutoConfigurationImportSelector 读取所有 starter 中的 spring.factories 文件,加载候选配置类 -> @Conditional 注解根据当前环境(如 classpath、用户自定义的 Bean 等)进行筛选 -> 最终通过的配置类被加载,其定义的 Bean 被注入到容器中。

这个机制的核心就是 Starter 负责“引入依赖”,自动配置负责“按需装配”

例如,当我们引入 spring-boot-starter-web 时:

  1. 相关的依赖(如 Tomcat, Spring MVC)被添加到 classpath。
  2. 这满足了 WebMvcAutoConfiguration 等配置类的 @ConditionalOnClass 条件。
  3. 如果用户没有自定义相关的 Bean(满足 @ConditionalOnMissingBean),WebMvcAutoConfiguration 就会生效。
  4. 它会自动配置好 DispatcherServletTomcat 服务器等所有 Web 开发需要的核心组件。

我们无需任何 XML 配置,就完成了一个功能完整的 Web 应用的搭建。

posted @ 2026-01-21 16:21  我是刘瘦瘦  阅读(2)  评论(0)    收藏  举报