SpringBoot中的自动配置过程

1. spring-boot-starter-web 在哪个包中?为什么默认扫描不到?

默认情况下,Spring Boot 确实不会扫描到 spring-boot-starter-web 中的代码。

  • 它在哪里? 当你引入这个依赖后,它会被下载到本地 Maven 仓库中,作为一个独立的 jar 包存在于你的项目 classpath 里。
  • 为什么默认扫描不到? 因为 @SpringBootApplication 注解中包含的 @ComponentScan,其默认行为是只扫描启动类所在的包及其子包。第三方 jar 包(如 spring-boot-starter-web)通常位于完全不同的包路径下(如 org.springframework.boot.autoconfigure.web.servlet),自然不会被默认的组件扫描机制发现。

2. 那 Spring Boot 是如何“扫描”到它的自动配置类的?

Spring Boot 发现并加载这些第三方 jar 包中的配置,根本不是通过传统的 @ComponentScan 包扫描机制,而是通过一套专门的自动装配机制(Auto-Configuration)来实现的。

这个过程可以拆解为以下核心步骤:

第一步:开启自动装配的“总开关”

启动类上的 @SpringBootApplication 是一个复合注解,它内部包含了 @EnableAutoConfiguration。这个注解就是告诉 Spring Boot:“请开启自动装配机制,去帮我找那些第三方 jar 包里的配置”。

第二步:核心执行器 AutoConfigurationImportSelector

@EnableAutoConfiguration 内部通过 @Import(AutoConfigurationImportSelector.class) 导入了一个选择器类。这个类就是自动装配的“核心引擎”,它负责去遍历当前项目引入的所有依赖 jar 包。

第三步:读取“路标”文件(关键所在)

Spring Boot 怎么知道哪些 jar 包里有自动配置类呢?它遵循一套严格的 SPI 规范。
在 Spring Boot 启动时,AutoConfigurationImportSelector 会去扫描 classpath 下所有 jar 包中固定路径的文件:

  • Spring Boot 3.x 规范路径META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  • Spring Boot 2.x 规范路径META-INF/spring.factories

spring-boot-starter-web(及其依赖的 spring-boot-autoconfigure)这个 jar 包里,就包含了这样一个文件,里面明文写满了自动配置类的全限定名(例如 WebMvcAutoConfiguration)。这就相当于给 Spring Boot 留了一个“路标”。

第四步:条件过滤(按需加载)

收集到所有候选的自动配置类后,Spring Boot 不会无脑全部加载,而是根据类上的 @Conditional 系列条件注解进行过滤。
比如,当它发现 WebMvcAutoConfiguration 时,会检查类上是否有 @ConditionalOnClass(DispatcherServlet.class)。因为你引入了 spring-boot-starter-web,classpath 下确实存在 DispatcherServlet,条件成立,这个配置类才会被真正加载并注册到 Spring 容器中。

总结

“默认只扫描启动类所在包”,仅仅针对的是业务组件(如 @Controller, @Service)。

而对于第三方 jar 包中的自动配置类,Spring Boot 是通过 @EnableAutoConfiguration 触发 AutoConfigurationImportSelector,去读取 jar 包内固定路径下的“路标文件”(如 AutoConfiguration.imports),并结合条件注解来实现精准发现和按需加载的。这两套机制是相互独立的。

posted @ 2026-07-29 16:51  RowkimZz  阅读(2)  评论(0)    收藏  举报