面试官问“Spring Boot 自动装配原理”时,其实是在考察你对 Spring 核心机制(如 Import) 与 Spring Boot 设计哲学(约定优于配置) 的理解深度。
你可以按照“底层注解 -> 核心流程 -> 关键文件”这个递进逻辑来回答,这会让面试官觉得你思路非常清晰。
1. 核心注解:@SpringBootApplication
自动装配的入口是启动类上的 @SpringBootApplication。它其实是一个复合注解,核心由三个部分组成:
-
@SpringBootConfiguration:本质就是@Configuration,声明配置类。 -
@ComponentScan:扫描当前包及其子包下的 Bean。 -
@EnableAutoConfiguration:自动装配的核心,它告诉 Spring Boot 开启自动配置功能。
2. 自动装配的“三步走”流程
当你面试时,重点描述 @EnableAutoConfiguration 内部发生的动作:
第一步:借助 ImportSelector 注入
@EnableAutoConfiguration 内部使用了 @Import(AutoConfigurationImportSelector.class)。这个类的核心作用是通过代码逻辑动态地往容器里批量导入配置类。
第二步:读取配置文件
在 AutoConfigurationImportSelector 中,Spring Boot 会去扫描所有 Jar 包下的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(注意:Spring Boot 3.0 之前是 spring.factories)。
-
这些文件中记录了成百上千个自动配置类(如
RedisAutoConfiguration)。
第三步:按需加载(条件装配)
这是最关键的一步。Spring Boot 不会把这几百个配置类全部加载进去,而是通过 @Conditional 系列注解进行过滤。
-
例如,只有当你引入了 Redis 的 Starter 依赖,Classpath 下才有 Redis 的驱动类,
RedisAutoConfiguration上的@ConditionalOnClass才会生效,从而完成装配。
3. 面试连环炮(常见 Q&A)
Q1:为什么 Spring Boot 3.0 把 spring.factories 换成了 .imports?
-
回答技巧: 主要是为了解耦和性能优化。旧的
spring.factories是个键值对格式,所有类型的配置(监听器、过滤器、自动配置)全塞在一起。新的.imports专为自动配置设计,结构更清晰,且在 AOT(原生镜像编译)中表现更好。
Q2:如何实现一个自己的 Starter?
-
回答技巧: 考查动手能力。
-
创建一个 Maven 项目,引入
spring-boot-autoconfigure。 -
编写配置类
@Configuration。 -
使用
@Conditional注解控制加载条件。 -
在
META-INF/spring/*.imports中注册该配置类。
-
Q3:自动装配和 @ComponentScan 有什么区别?
-
回答技巧:
@ComponentScan扫描的是你自己写的业务代码;自动装配加载的是第三方库或框架提供的配置类。两者互补,共同构成了 Spring 的 Bean 管理。
4. 总结成大白话(一分钟记忆)
“Spring Boot 在启动时,会通过
AutoConfigurationImportSelector去扫描所有 Jar 包下的imports文件,获取待定的配置类列表。然后利用@Conditional条件注解进行筛选,只有满足条件的类(比如 Classpath 里有相关依赖)才会被真正注入 Spring 容器。这就是所谓的‘约定优于配置’。”
你在准备面试时,建议重点复习一下 ConditionalOnClass 和 ConditionalOnMissingBean 这两个注解,面试官特别喜欢问它们是如何实现“默认配置”和“用户自定义配置”共存的。