SpringBoot-Starter原理#
一句话答案#
Starter 是依赖+自动配置的封装,引入依赖后自动发现配置类(Boot 3 用
AutoConfiguration.imports,Boot 2 用spring.factories),@Conditional 条件过滤按需加载。
核心要点
原理: 1.引入 Starter 依赖 → 2.自动发现 AutoConfiguration 类(Boot 3: AutoConfiguration.imports / Boot 2: spring.factories)→ 3.@Conditional 条件判断 → 4.自动创建 Bean
自定义 Starter: 创建 autoconfigure 模块 + starter 模块,在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Boot 3)或 META-INF/spring.factories(Boot 2)注册
面试回答(2分钟版)
SpringBoot Starter的本质是把依赖引入和自动配置打包在一起,实现开箱即用。工作原理分四步:第一步引入Starter依赖,它会传递引入所需的所有jar包;第二步SpringBoot启动时扫描候选配置类,Boot 3使用
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,Boot 2使用META-INF/spring.factories,找到注册的自动配置类;第三步自动配置类上的@Conditional系列注解做条件判断,比如@ConditionalOnClass检查某个类是否存在、@ConditionalOnMissingBean检查用户是否已自定义了同类型Bean,只有条件满足才创建Bean;第四步按需创建并注册Bean到容器。所以不是引入Starter所有配置都生效,@Conditional会过滤掉不满足条件的。自定义Starter的步骤是创建autoconfigure模块写自动配置类加上条件注解,再创建starter模块只做依赖聚合,在AutoConfiguration.imports(Boot 3)或spring.factories(Boot 2)中注册配置类即可。排查自动配置不生效可以用—debug启动看ConditionEvaluationReport。
追问与易错
追问方向:
- “spring-boot-starter 和 spring-boot-starter-xxx 区别?”→ spring-boot-starter 是核心 Starter 只包含自动配置和基础依赖;spring-boot-starter-xxx(如 -web、-data-jpa)是功能 Starter,引入特定领域的依赖和自动配置
- “spring.factories 在 Boot 3 还能用吗?”→ Boot 3.0 起 spring.factories 不再用于自动配置类发现,改用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件;Boot 2.7 是过渡版本两种都支持
- “怎么排查自动配置不生效?”→ 启动时加 —debug 参数查看 ConditionEvaluationReport,会列出所有自动配置类及其条件匹配结果(Positive/Negative matches),快速定位哪个 @Conditional 条件不满足
易错点:
- ❌ 引入 Starter 所有 Bean 都创建——@Conditional 会过滤
- ❌ 混淆 Boot 3 和 2 的发现机制