《Spring Boot 实战》1.2 父子 POM 与依赖管理
讲清父 POM 的 parent 继承与 dependencyManagement 版本管理的分工,演示导入 spring-boot-dependencies BOM、子模块声明依赖、用 Enforcer 预防版本冲突,以及可复用库模块的打包与发布方式。
tag
讲清父 POM 的 parent 继承与 dependencyManagement 版本管理的分工,演示导入 spring-boot-dependencies BOM、子模块声明依赖、用 Enforcer 预防版本冲突,以及可复用库模块的打包与发布方式。
从团队规模、发布节奏、复用需求与编译耗时四个维度判断单体还是多模块,给出「先别拆」的五条红线与「该拆了」的信号,对比按层、按业务、按可复用库三种拆分粒度各自的代价与适用场景,并附一份可在评审会上直接使用的决策清单与三个常见误区,以及判断时常被忽略的隐性维护成本。
Spring Boot 默认的错误响应由 BasicErrorController 生成,字段有限且不携带业务语义。本节先看清默认 JSON 长什么样,再讲 @ExceptionHandler 的用法与作用范围(只对所在控制器生效)、多异常与继承关系的匹配顺序、@ResponseStatus 与 ResponseEntity 的状态码控制,并说明为什么在每个控制器里重复写处理方法是不可持续的。
《Spring Boot 实战》全书导航页:说明本卷面向已会用 Spring Boot、但没独立交付过生产服务的工程师这一读者定位,给出三条学习路径与一份十周计划,讲清四个部分之间的依赖关系,并按部分列出 18 章 54 节的完整索引,另含生产场景常见问题速查表,每一节都配一句话说明,方便按需跳读与随时查阅。
《Spring Boot 实战》全 55 篇,面向已会用 Spring Boot、准备独立交付生产服务的工程师:从多模块工程结构、依赖治理、配置密钥与测试体系讲起,覆盖 REST 设计、数据访问、API 契约、缓存、认证授权、异步消息,再到连接池、事务并发、调度批处理、文件与对象存储,最后落到容器化部署、可观测性、性能调优与一次完整的生产级交付。本页给出全书分章目录。
同一个 DTO 在新增和修改时规则常常冲突:新增时 id 必须为空,修改时 id 必须非空。本节用图书 DTO 演示校验分组、@GroupSequence 组顺序、嵌套对象级联与集合元素校验,指出 @Valid 加错位置会静默跳过的陷阱,并以一个新增/修改共用 DTO 的完整示例收尾。
标准注解不够用时,就要自己写约束。本节以 ISBN 格式校验为例,完整演示自定义注解 + ConstraintValidator 实现,拆解 message、groups、payload 三个成员,讲清 ValidationMessages.properties 的中文国际化与 4.x 的编码要求,并给出在 Service 层手动触发校验的两种方式与真实异常响应。
本节讲清 Jakarta Validation 与 Hibernate Validator 9.0 的关系,演示如何用 spring-boot-starter-validation 给图书接口启用 @Valid,速查 @NotNull、@NotBlank、@NotEmpty 等常用注解,并贴出校验失败时的真实响应与 @Valid、@Validated 的区别。
本节把「图书管理服务」从随手写的接口改造成符合 REST 约定的一整套 API:资源如何命名、HTTP 方法与状态码怎样搭配、为什么幂等性决定重试策略、分页过滤排序如何与 Spring Data 的 Pageable 对齐、统一响应包装体值不值得用,以及 API 版本化的三种方式与 4.x 内建支持。
本节讲清控制器如何取出请求数据、又如何写回响应:六种取参方式(@PathVariable、@RequestParam、@RequestBody、@RequestHeader、@CookieValue、@ModelAttribute)的适用场景,@RequestBody 与 @ModelAttribute 的本质区别,四种返回类型的取舍,以及 Jackson 3 的包名与注解变化。
本节把「图书管理服务」的 HTTP 入口搭起来:分清 @Controller 与 @RestController(以及 @ResponseBody 的隐含关系),掌握 @RequestMapping 家族与类级、方法级路径拼接规则,用正则约束路径变量,并亲眼看到路径不匹配返回 404、HTTP 方法不匹配返回 405 的差别。最后演示 4.x 新增的 API Versioning 最小用法。
学会读 --debug 打印的自动配置报告:从 Positive/Negative matches、Exclusions、Unconditional classes 四段定位 bean 为何没生效,用 DataSource 实例逐层看 reason,再用 ConditionEvaluationReport、Actuator 端点与 IDE 断点把排查串起来,附症状速查表。
从零手写一个可发布的 acme-spring-boot-starter:完整 pom、配置属性类、客户端、@AutoConfiguration 自动配置类与 .imports 登记文件,配条件装配与排序保证不侵入宿主项目,再讲 mvn install、宿主验证、--debug 报告片段与七个常见错误。
从一行 spring-boot-starter-webmvc 出发,拆开一个 starter 的两块拼图——依赖聚合模块与自动配置模块,用 4.1.1 的真实依赖树讲清它到底拉了哪些 jar,再给出 4.0 模块化后的命名三段式、-test 测试模块约定、为什么 starter 不能带 @ComponentScan,以及按用途分类的官方 starter 一览表。
本节把配置源按官方 4.x 顺序完整排一遍,并用实测回答「同一个键在五处定义时谁生效」:先给出从命令行、环境变量到默认属性的优先级表,再讲环境变量的命名转换、占位符与 random 值、--key=value 与 -D 的区别,最后给出配置加密的思路与选型。
本节把 6.1 里的一整块配置绑成类型安全的 Java 对象:先对比 @ConfigurationProperties 与 @Value 的差别,再给出 record 与构造器绑定的写法(4.x 已无需 @ConstructorBinding),覆盖嵌套对象、List/Map 与松散绑定规则,最后用 @Validated 做校验并生成 IDE 补全元数据。
本节围绕「图书管理服务」的 dev/test/prod 三套配置展开:先对比 properties 与 yml 的取舍,再拆解 YAML 的缩进、冒号、隐式类型、多文档等六个常见坑;然后讲清 application-{profile}.yml 的命名、激活方式、@Profile 与组合表达式,最后用 spring.config.import 读取 .env 并介绍 4.1 的编码指定能力。
本节用图书缓存 BookCache 实测 Bean 从构造器到销毁的完整生命周期,用真实日志证明 @PostConstruct、InitializingBean、自定义 init-method 与 BeanPostProcessor 的执行顺序,并说明 SmartInitializingSingleton、ApplicationRunner 各自该用在什么时机。
本节用图书管理服务的 BookService 与 BookRepository 对比构造器、Setter、字段三种注入方式,解释官方为何推荐构造器注入,演示 @Qualifier 与 @Primary 解决同类型多 Bean,并拆解五种作用域与 prototype 注入 singleton 的经典陷阱及两种解法。
本节从一段手写 new 的代码讲起,说明 IoC 到底反转了什么,理清 ApplicationContext 与 BeanFactory 的关系,逐一演示 @Component、@Bean、@Import 把类变成 Bean 的三种方式,并用 getBeanDefinitionNames() 实测打印容器内容,帮你判断哪些类该交给容器、哪些不该。