《Spring Boot 入门》附录 B:配置项速查
本附录把 Spring Boot 最常用的配置项按服务器、应用、数据源、JPA、Jackson、日志、Web 资源、校验、Actuator、Flyway 十类汇总成速查表,每项标注默认值、作用与对应正文小节,并附 3.x 到 4.x 的配置项迁移对照表,涵盖 Jackson 属性改名、MongoDB 与 Session 前缀调整等变更。
category
本附录把 Spring Boot 最常用的配置项按服务器、应用、数据源、JPA、Jackson、日志、Web 资源、校验、Actuator、Flyway 十类汇总成速查表,每项标注默认值、作用与对应正文小节,并附 3.x 到 4.x 的配置项迁移对照表,涵盖 Jackson 属性改名、MongoDB 与 Session 前缀调整等变更。
从 Mono/Flux 的惰性讲到 subscribe 那一刻的 onSubscribe→request(n)→onNext 次序,用 BaseSubscriber 与 doOnRequest 观察背压协议,再对比 onBackpressureBuffer/Drop/Latest/Error 四种策略的适用场景,并说明 Sinks 如何取代已废弃的 Processor。
从图书借阅服务的逾期提醒出发,讲清 @Scheduled 的 fixedRate、fixedDelay、cron 三者真实差异,单线程调度器为何互相拖累,如何用 SchedulingConfigurer 换线程池,并横向对比 Quartz 与 XXL-JOB,最后给出一张按场景选型的决策表。
本附录把全书用到的 Spring Boot 注解按用途分成启动配置、依赖注入、生命周期、条件装配、Web、校验、数据事务、测试八类,每类一张表列出注解、作用、所在包与详见章节,末尾附一张 3.x 到 4.x 的注解与包名变更对照表,方便迁移时逐条核对。
没有事务时,扣库存、记流水、扣额度会各自提交,中途失败就留下不一致数据。本节用图书借阅场景演示这个问题,再讲 @Transactional 加在方法还是类上、rollbackFor 默认只回滚运行时异常的坑、readOnly 与 timeout 的作用,以及 TransactionTemplate 编程式事务的适用场景。
对比 Filter(容器层)与 HandlerInterceptor(MVC 层)的执行时机与可见上下文,拆开 HandlerExceptionResolver 的顺序链,讲清 @ControllerAdvice、@ResponseStatus 与 ResponseStatusException 各由谁解析,并划出异常在两层的处理边界。
分布式事务不是银弹。本节对比 2PC/XA、TCC、Saga、本地消息表与事务消息的适用边界,重点给出本地消息表 + 轮询补偿在「借书成功 → 扣减库存 / 发通知」场景下的完整实现思路,并说明本文不部署 Seata 等中间件,以及消费端幂等与对账补偿的必要性。
拆开 HandlerMethodArgumentResolver 的解析链与默认顺序,讲清 @RequestParam / @PathVariable / @ModelAttribute 各归哪个解析器,再深入 @RequestBody 经 HttpMessageConverter 的选型规则,最后说明自定义 resolver 与 converter 的注册位置与优先级。
用「同一本书被多人同时借」讲透并发写冲突:乐观锁 @Version 的失败原理与重试封装、悲观锁 SELECT ... FOR UPDATE 的写法与代价、两者的取舍表、加锁顺序与死锁避免,为什么不推荐在长事务里做乐观锁重试,以及库存扣减的原子更新方案。
把一次请求进入 DispatcherServlet.doDispatch() 后的调用链逐段拆开:getHandler 如何遍历 HandlerMapping、HandlerAdapter 为什么要多一层适配、HandlerExecutionChain 怎么挂上拦截器、返回值如何经 HandlerMethodReturnValueHandler 落地,并标出 4.x 模块化后的新包路径。
讲清 @Transactional 的边界为什么该画在 Service 而不是 Controller 或 Repository,自调用与 private 方法失效的代理原理,只读事务与超时的真实作用,事务内做远程调用的危害,TransactionTemplate 的适用场景,以及 REQUIRES_NEW 与 NESTED 在 JPA 下的语义差异。
列表接口几乎都要分页。本节讲清 Pageable、Page、Slice、Sort 四者的关系,贴真实 SQL 展示分页背后的 count 与数据两条语句,说明为什么不该直接暴露 Page 的 JSON、排序字段为何要白名单校验,并给出深分页的性能问题与 keyset 分页思路。
从「this 自调用不经过代理」这一根因出发,解释 @Transactional、@Async、@Cacheable 为何会在同类内部调用时静默失效,梳理 private、final、static 方法的织入失败与 CGLIB 的真实告警文本,并对比 AopContext.currentProxy() 与 ObjectProvider 自注入两种解法的代价。
分库分表是数据库工程的最后一张牌,多数团队还没到需要它的那一步。本节给出接入边界:先分区、归档、加索引的判断依据,分片键选择与热点、跨片查询与深度分页的代价、分布式主键方案,以及 ShardingSphere-JDBC 与 JPA 的摩擦,并明确本文不展开完整分片实现。
系统对比 Java 序列化方案:JDK 原生序列化的原理与安全风险、Jackson 与 Gson 等 JSON 方案、Kryo 高性能二进制、Protobuf 结构化方案,给出性能基准对比、适用场景与选型指南。
系统讲解 Java 并发设计模式:生产者-消费者、工作窃取、不可变对象、读写分离、双重检查锁定、Copy-on-Write、Future 承诺与线程封闭等模式,包含适用场景、代码示例、JUC 落地与实战陷阱。
讲清 @Aspect 如何经 AnnotationAwareAspectJAutoProxyCreator 与 ReflectiveAspectJAdvisorFactory 变成 Advisor,再看 ReflectiveMethodInvocation 如何串起拦截器链,并核实 @Order、@Priority 与同一切面内各类 advice 的相对顺序。
读写分离能提升读吞吐,但前提是单库已经优化到位。本节用 AbstractRoutingDataSource 实现数据源路由,靠 @Transactional(readOnly = true) 决定读写走向,解释事务内切换数据源为何无效,并给出主从延迟下「写完读不到」的三种处理与从库故障降级。
系统讲解 OOM 排查与堆转储分析:五种 OOM 类型与成因、排查流程、jmap 与自动转储获取堆转储、MAT 的 Leak Suspects 与 Dominator Tree 分析、内存泄漏定位案例,以及线上兜底与预防手段。
系统讲解 Arthas 线上诊断实战:安装与启动、常用命令速查、dashboard 与 thread 命令、watch 与 trace 方法级观测、jad 反编译与 redefine 热更新、线程与内存排查,以及生产环境的安全使用规范。