尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Spring 源码系列(20): @SpringBootApplication 三注解拆解

Spring 源码系列(20): @SpringBootApplication 三注解拆解 阅读前提示进入Spring Boot 阶段第 20–24 篇。Boot 是「约定优于配置」的封装层但底层全是前面学的 IoC / BPP / 条件注解。本篇先拆SpringBootApplication——一个注解背后其实是三个注解的复合理解它你就拿到了 Boot 自动化的「总开关」。一、引子一个注解启动了整个生态SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}SpringBootApplication不是新机制它是三个注解的「语法糖」Target(ElementType.TYPE)Retention(RetentionPolicy.RUNTIME)SpringBootConfiguration// Configuration标记配置类EnableAutoConfiguration// ★ 自动配置的总开关ComponentScan(...)// ★ 包扫描默认扫当前类所在包及子包publicinterfaceSpringBootApplication{}二、三大组成逐一拆解2.1 SpringBootConfiguration就是一个Configuration让你这个启动类本身成为配置源可在里面写Bean。ConfigurationpublicinterfaceSpringBootConfiguration{}2.2 ComponentScan默认扫描启动类所在包及其子包下的Component/Service/Controller/Repository。这也是为什么「启动类要放在根包」——扫不到就 Bean 不注册。⚠️ 易错点如果 Controller 放在启动类包之外且没额外配置scanBasePackages这些 Bean 不会被注册访问就 404。2.3 EnableAutoConfiguration核心AutoConfigurationPackage// 把启动类所在包注册进容器供自动配置按包定位Import(AutoConfigurationImportSelector.class)// ★ 加载所有自动配置类publicinterfaceEnableAutoConfiguration{}AutoConfigurationImportSelector是自动配置的「发动机」——它读取META-INF/spring.factoriesBoot 2.7 起逐步迁移到META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports把所有xxxAutoConfiguration类批量导入容器。第 21 篇会深挖。三、三个注解的协作关系SpringBootApplication ├ SpringBootConfiguration → 启动类成为 Configuration ├ ComponentScan → 扫描你的业务 BeanController/Service... └ EnableAutoConfiguration → 导入框架自带的 xxxAutoConfiguration按条件生效 ↓ 你的 Bean 框架的自动配置 Bean共同组成一个 ApplicationContext 关键认知自动配置类也是普通Configuration只不过它们带Conditional条件——满足条件比如 classpath 有某个类才生效。这就是「约定优于配置」的本质。四、SpringBootApplication 三注解拆解图五、常见误区误区正解SpringBootApplication 是全新机制不是ConfigurationComponentScanEnableAutoConfiguration的复合自动配置类无条件全部生效错大多带Conditional按 classpath/环境按需生效启动类放哪都行默认只扫启动类所在包及子包放错位置 Bean 扫不到EnableAutoConfiguration 直接 new Bean不它Import一个 Selector 去批量导入配置类自动配置优先级高于你的 Bean你的Bean通常优先级更高可覆盖自动配置第 21 篇详述 面试题自测SpringBootApplication由哪三个注解组成各自作用为什么启动类要放在根包EnableAutoConfiguration靠什么类批量导入配置自动配置类为什么不会全部生效SpringBootConfiguration和Configuration什么关系自动配置和你自己写的Bean冲突时谁优先 Debug 小技巧在AutoConfigurationImportSelector.getCandidateConfigurations打断点观察它返回的所有自动配置类名几百个再在ConditionEvaluator.shouldSkip断点看某个xxxAutoConfiguration如何因ConditionalOnClass不满足而被跳过。下一篇预告第 21 篇自动配置原理深挖——AutoConfigurationImportSelector如何读取配置、如何排序、你的Bean为何能覆盖自动配置以及 Boot 2.7 的imports文件与旧版spring.factories的差异。如果这篇对你有帮助欢迎点赞 · 收藏 · 关注三连支持。Spring 源码系列共 30 篇由浅入深持续更新中。有疑问或想深挖的源码点评论区告诉我下篇见。
返回列表