从 2014 年第一版发布到现在,Spring Boot 几乎成了 Java 后端开发的默认起点。哪怕是没接触过它的人,只要搜过“第一个 Spring Boot 程序”“Spring Boot 教程”,都会看到清一色的“快速创建项目”“自动配置”“内嵌容器”这些说法。但真正到了自己动手做项目时,才发现网上那些片段式教程根本不顶用——项目骨架怎么搭、Bean 怎么注入、日志怎么输出、缓存怎么上、WebSocket 配置写在哪、Spring Security 迁移怎么搞,每一环都能卡住人。这篇指南我就按自己的实际开发习惯,把一个 Spring Boot 项目从零到能上线部署的完整流程拆开讲,覆盖脚手架搭建、Bean 注入、日志、CRUD、缓存、WebSocket、Spring Security、RPC 集成和典型业务场景,适合刚学完 Java 基础想独立做项目的新手,也适合正在做商城、办公管理系统、餐饮 SaaS 这类题目的同学直接抄作业。
1. 项目全貌与核心思路拆解
1.1 一个 Spring Boot 项目最该先想清楚的事
很多人拿到题目或者接到需求,第一反应就是打开 IDE 新建项目,然后急着写 Controller。这个顺序我强烈建议反过来。你先花一小时把下面几件事定下来,后面能省好几天返工时间:项目要解决的核心业务是什么、有哪些角色在使用、数据模型大概长什么样、需不需要缓存、需不需要实时推送、是单体还是微服务。
以常见的“企业办公用品管理系统”为例,它的核心业务就是办公用品的申购、入库、出库、审批、库存盘点。角色至少包括普通员工、行政管理员、审批人。数据模型必然涉及用户表、办公用品表、库存表、申购单表、审批记录表。搞清楚这些后,你再决定技术选型:Spring Boot 做接口层、MyBatis-Plus 或 JPA 做持久层、Redis 或 Caffeine 做缓存、Spring Security 做登录认证。这个顺序才是项目开发的正确打开方式。
还有个容易忽略的点:明确项目的边界。比如“基于 Spring Boot 的商城”这类设计题目,千万别一上来就想做秒杀、分布式事务、消息队列。设计题目考察的是 CRUD 基本功、表关系设计、分层结构和基础安全控制。你先把商品、分类、购物车、订单、用户这几张表设计好,再把订单状态流转用清晰的状态机方式写出来,就已经能拿高分了。
1.2 Spring、Spring Boot、微服务三者到底什么关系
这是热词里被问到最多的问题。用生活化的类比来说:Spring 是整套“毛坯房建材”,提供了 IoC 容器、AOP、事务管理这些底层能力,但你要自己砌墙、走水电;Spring Boot 是“精装修交付”,内置了 Tomcat、自动配置、健康检查,拿到就能住;微服务则是“小区规划”,把一栋楼拆成多栋独立的小楼,每栋楼可以单独装修、单独维护,楼与楼之间通过 HTTP 或 RPC 通信。
落到技术层面就是:Spring 框架需要你手动配置数据源、事务管理器、视图解析器,而 Spring Boot 通过自动配置和 starter 机制把这些全都默认处理掉了。Spring Boot 和微服务也不是一回事。微服务架构可以用 Spring Boot 实现,也可以用其他技术栈实现。Spring Boot 解决的是“单个服务怎么快速落地”的问题,微服务解决的是“多个服务怎么协同、怎么治理”的问题。
一个 Spring Boot 项目里一定要有清晰的包结构。我常用的分层是:controller 放接口、service 放业务逻辑、mapper 或 repository 放数据访问、entity 放实体、dto 放传输对象、config 放配置类、common 放统一返回结果和异常处理。不管项目大小,这个骨架保持清晰,后面加功能就不会变成一锅粥。
2. 第一个 Spring Boot 程序:从 0 到 1 的脚手架搭建
2.1 快速创建项目别只用 IDEA 模板
网上教程最常让你做的就是打开 IDEA,选 Spring Initializr,填 group、artifact,选依赖,下一步下一步。这没问题,但我更推荐直接用 Spring Initializr 网站生成项目,或者用命令行脚手架,原因有两个:一是网页版能让你直观看到每个依赖对应的场景说明;二是生成后的项目结构干净,不容易混入 IDE 的额外配置。
用网页版生成时,核心配置几个地方要注意。Group 一般是公司域名反写,比如 com.example;Artifact 是项目名,建议全小写,如 office-supplies;Java 版本选 17 或 21,Spring Boot 版本选 3.x 系列(当前主流稳定版本)。依赖方面,做 Web 项目必选 Spring Web;操作数据库选 Spring Data JPA 或 MyBatis Framework;做登录认证选 Spring Security;做接口文档选 springdoc-openapi(注意 Spring Boot 3 要用 2.x 版本的 springdoc)。
生成后用 IDEA 打开,顺手做三件事:第一,检查 pom.xml 或者 build.gradle,确认依赖版本是否协调;第二,启动一次项目跑通默认的健康检查,访问 /actuator/health 能返回 UP 就说明骨架没问题;第三,创建 application.yml,替换掉默认的 application.properties。我个人一直用 YAML,层次结构清晰,写多环境配置时比 properties 好管理得多。
2.2 Bean 注入控制的底层逻辑与常见误区
Spring Boot 项目里 Bean 的管理是灵魂。所谓 Bean,就是由 Spring 容器创建和管理的对象。控制反转的意思原本是“对象不再自己 new 自己”,而是由容器统一创建和注入。常见的注入方式有构造器注入、Setter 注入和字段注入。其中字段注入写起来最爽,但我不推荐在正式项目里大量使用,因为它在单元测试时没法方便地替换依赖。
如果你在项目里见到类似“添加接口时提示 required a bean of type XXX that could not be found”的报错,十有八九是这几种情况:类没有加 @Service、@Repository、@Component 之类的注解;类加了注解但没被组件扫描扫到;或者接口和实现类之间没有正确指定。排查思路很简单,先用 @SpringBootTest 写个测试,注入容器上下文,ApplicationContext 的 getBean 方法打印一下看看哪些 Bean 没注册进来。
控制 Bean 注入还有几个进阶玩法:用 @ConditionalOnProperty 控制某个配置类是否生效,用 @Primary 指定多个同类型 Bean 时的优先注入,用 @Qualifier 精确选择 Bean 名称。在做多数据源配置时,后两个几乎是必用的。比如你同时配了 MySQL 和 PostgreSQL 两个数据源,Spring 没法靠类型判断注入哪个,只能靠 @Qualifier 指定名称。
2.3 日志体系别只用 System.out
新手最典型的做法就是 System.out.println 打天下。项目小的时候没事,项目一上线,日志文件里全是“订单创建成功”“用户登录”这种裸输出,没有时间、没有级别、没有类名,线上出了问题根本没法排查。Spring Boot 默认整合了 Logback,你不需要额外引入依赖,只要在 resources 目录下建一个 logback-spring.xml 就能接管日志配置。
最基础的配置要做三件事:定义日志级别、定义输出格式、定义滚动策略。日志级别从低到高是 TRACE、DEBUG、INFO、WARN、ERROR。日常开发用 INFO,排查问题时临时调到 DEBUG。输出格式我习惯用这种:时间 [线程名] 日志级别 类名: 方法名 - 日志内容。滚动策略一定要配,不然跑几个月后单个日志文件十几个 GB,打开都卡。
在代码里用日志也要注意,别在日志里拼接敏感信息,比如明文密码、身份证号、银行卡号。日志脱敏是很多项目安全审计的重点项。要输出请求参数时,只记录业务必须的数据,或者用 Logback 的过滤器做脱敏处理。这不仅是规范问题,一旦出了安全事故,日志就是第一责任现场。
3. 核心业务实战:CRUD 模块、配置管理、本地缓存
3.1 地址簿管理等典型业务模块的完整实现套路
热词里反复出现“使用 Spring Boot 编写地址簿管理”,这类功能看着简单,却是检验基本功的好题目。地址簿管理本质上就是一个标准的单表 CRUD:新增地址、修改地址、删除地址、查询地址列表、设置默认地址。要想写好,关键不是 CRUD 本身,而是“默认地址”这个业务规则。
实现思路这样设计:地址表 address 里有一个 is_default 字段,0 表示非默认,1 表示默认。设置默认地址时,不能只把当前地址的 is_default 改成 1,还要把该用户其他所有地址的 is_default 重置为 0。这就要用事务。在 Service 方法上加 @Transactional,先执行 update 把所有地址置为非默认,再执行 update 把指定地址置为默认。两步操作要么都成功,要么都失败。
每个列表查询都要注意脱敏和字段裁剪。比如地址簿接口返回的数据,手机号如果不需要在编辑页预填,就不要回传完整号码;地址列表按默认地址排在最前,然后按创建时间倒序。分页查询我用 MyBatis-Plus 的 Page 或者 Spring Data JPA 的 Pageable,统一返回一个 PageResult 对象,包含总记录数、当前页、总页数和列表数据。
这类模块最能反映一个人的编码习惯。我见过太多人把所有逻辑都写在 Controller 里,一个方法七八十行,各种 if 嵌套。正确的分层做法是:Controller 负责接收参数和返回结果,参数合法性校验交给 Bean Validation 注解;Service 写业务逻辑;Mapper 或 Repository 只做数据访问。Controller 里绝不出现 nextLine 循环和手工 set 数据的代码。
3.2 YAML 配置文件到底怎么组织不踩坑
Spring Boot 的配置管理看着简单,实际坑很多。application.yml 是核心配置文件,但不要把所有内容都塞进去。我习惯按环境拆成 application.yml、application-dev.yml、application-prod.yml,主配置里用 spring.profiles.active 指定当前环境。这样本地连本地数据库,测试环境连测试库,上线时切个配置就行,代码不用改一行。
WebSocket 集成时,配置经常写到 yml 里。比如注册 WebSocket 端点、设置路径、配置跨域。这里要注意一个常见坑:WebSocket 的握手确实走 HTTP,但握手之后的通信是长连接,不受普通拦截器限制。你要是想在 WebSocket 连接前做登录校验,必须在 HandshakeInterceptor 里做,不能指望 Spring Security 的普通过滤链去拦截 WebSocket 帧。
yml 配置里还有个经典问题:缩进。YAML 对缩进极其敏感,一个空格错了就报语法错误。出现“expected block end”这类报错时,别急着改代码,先检查 yml 的缩进和制表符。还有,yml 里字符串不需要加引号,但某些特殊字符,比如带冒号的字符串,必须加引号,不然会被解析成 map。
配置加密也是项目上线前一定要处理的。数据库密码、接口密钥这类敏感配置不能明文写在 yml 里。常见方案是使用 Jasypt 或者 Spring Cloud Config 配合密钥管理服务。Jasypt 的做法是生成一个加密后的密文,配置里写 ENC(密文),启动时通过环境变量传入解密密钥。这个方案的成本很低,但对安全提升很大。
3.3 Caffeine 本地缓存的引入与命中率调优
热词里出现 Caffeine,这正好是很多人从“会写 CRUD”到“考虑性能”的第一步。Caffeine 是高性能的本地缓存库,和 Spring Cache 整合起来非常顺。为什么需要缓存?拿商城项目举例,商品分类、首页轮播图这类数据几乎不变,每次请求都查数据库,纯属浪费。把热点数据缓存在内存里,接口响应时间可能从几十毫秒降到几毫秒。
引入 Caffeine 的做法是,在 pom.xml 里加 caffeine 依赖,然后写一个 CacheManager 的配置类,定义缓存的名字和策略。Spring Cache 的注解 @Cacheable、@CachePut、@CacheEvict 会用上。@Cacheable 是查询时先查缓存,命中就直接返回;@CachePut 是更新缓存;@CacheEvict 是删除缓存。这三个注解对应了缓存使用的三个最核心操作。
调优时最值得关注的是缓存命中率。刚开始可以给 Caffeine 设置一个较大的初始容量,比如 1000,然后观察实际命中率。如果命中率长期低于 80%,说明缓存策略有问题,热门数据的 key 设计不合理;如果命中率很高但在更新数据后出现“读到旧数据”的问题,说明缓存淘汰策略或者 @CacheEvict 的位置不对。缓存虽好,但不要把所有数据都往缓存里塞。变化极频繁的数据,比如库存数字、实时价格,根本不适合用本地缓存,这时候该上 Redis 或者其他实时方案。
4. 进阶集成:WebSocket、Spring Security 与 RPC 方案选型
4.1 Spring Boot 3 中 Spring Security 配置迁移实战
Spring Boot 3 带来的最大变化之一是 Spring Security 的配置方式彻底变了。用 Spring Boot 2.3 之前写法的人,升级到 Boot 3 后几乎必报错,报错集中在 WebSecurityConfigurerAdapter 被移除这个点上。这个类在 Spring Security 5.7 开始就被标记为 deprecated,到 Spring Security 6 直接删了。
新写法是组件化配置:创建一个配置类,注入 SecurityFilterChain 和 AuthenticationManager 等 Bean。最基本的配置逻辑是:定义哪些接口不需要认证、哪些需要认证、登录页面或登录接口怎么处理、密码加密器用什么算法、关闭 CSRF 还是保留 CSRF。具体的代码结构不贴完整版了,但核心思路你要明白——现在是通过 Lambda DSL 风格配置,写法更贴近函数式编程。
迁移过程中有两个特别容易踩的坑。第一个是密码加密算法。新版本的默认密码编码器是 DelegatingPasswordEncoder,你存密码时必须使用 {bcrypt} 前缀标识算法,否则启动时虽然不报错,但登录时永远校验不通过。第二个是 CSRF。如果你做的是前后端分离项目,接口通过 Token 认证,那 CSRF 保护通常可以关闭,但如果你做的是传统服务端渲染项目,一定不能关,关了就会留下安全漏洞。
还有些细节值得注意:Spring Security 6 默认不允许同源跨域请求携带凭证,前后端分离项目要显式配置 CorsConfigurationSource;登录成功的处理也从自定义 Handler 变成了在 SecurityFilterChain 中配置 successHandler。说白了,迁移的本质是把原来继承、覆写的方式,换成组合 Bean 的方式。
4.2 WebSocket 集成的场景判断与配置要点
WebSocket 不是所有项目都需要。什么场景下才真正需要?订单状态实时推送、聊天消息、拍卖出价、游戏对战、监控面板数据刷新。如果是这种场景,WebSocket 确实比轮询好得多。但如果只是做个普通的表单提示,用轮询或者 SSE 就够了。热词里出现“Spring Boot 集成 WebSocket yml 配置”,说明很多人已经走到了需要实时通信这一步。
Spring Boot 集成 WebSocket 的基本步骤是:加 spring-boot-starter-websocket 依赖,注册一个 WebSocketHandler,在配置类里注册端点。这里有一个常见的设计选择:用原生 WebSocket API 还是用 STOMP 协议。原生 WebSocket 最简单,适合少量消息、自定义格式的场景;STOMP 复杂一些,但支持订阅模式和广播模式,适合聊天室、通知中心这类需要按主题分发的场景。
我在实际项目里用 STOMP 比较多,因为前端用 SockJS 配合 STOMP 客户端,天然支持断线重连和主题订阅。配置时注意设置 allowed-origin-patterns,不然浏览器跨域会把握手请求拦截掉。另外,WebSocket 连接数一定要设定上限,不然恶意连接可以把服务端内存耗尽。
4.3 OpenFeign、gRPC 与 QueryDSL 的版本适配问题
热词里有两个很具体的版本问题:io.github.openfeign.querydsl 与 Spring Boot 版本对应,以及 gRPC 协议在 Spring Boot 中的集成。这两个都是典型的多服务通信场景。OpenFeign 是声明式 HTTP 客户端,在微服务架构中用起来很方便:定义一个接口,加 @FeignClient 注解,写明服务名和路径,方法签名直接对应远程接口。
但 OpenFeign 的坑在于版本兼容性。Spring Cloud 的版本是跟着 Spring Boot 走的,你用了 Spring Boot 3.2,Spring Cloud 就必须用对应的 2023.0.x 版本。如果版本不匹配,启动时最常见的报错是找不到 FeignClient 的自动配置类。确定版本对应关系最稳妥的办法是看 Spring Cloud 官方文档里的版本说明,或者直接去 Spring Initializr 里同时勾选 Spring Boot 和 Spring Cloud,让它自动生成匹配的版本。
gRPC 和 HTTP 接口不同,它走的是 HTTP/2 协议,用 Protocol Buffers 作为接口定义语言和消息格式。在 Spring Boot 里集成 gRPC 需要引入 grpc-spring-boot-starter 这类第三方库。常见问题是 protobuf 的版本和 grpc 版本必须严格匹配,稍有出入就会出现编译错误。相比 OpenFeign,gRPC 的性能更好、序列化更紧凑,适合内部服务间的高频调用,代价是调试不够直观,抓包不方便。
QueryDSL 则是查询层面的工具,适合动态查询条件非常多的场景,比如后台管理系统的多条件筛选。它和 Spring Boot 的版本适配主要看 QueryDSL 版本和 Java 版本。Q类生成依赖注解处理器,IDE 里如果没配置好注解处理,就会一直报找不到 Q 开头的类。遇到这种问题,检查编译插件配置是第一优先级。
5. 典型项目场景落地:商城、办公用品管理、餐饮 SaaS 与 AI 集成
5.1 设计题目类项目的标准打法
看热词里有“Spring Boot 设计题目商城”和“基于 Spring Boot 的企业办公用品管理系统的设计与实现”,这类题目在毕业设计和课程作业里出现频率极高。它们的共性是:业务逻辑清晰、功能模块常规、数据库表不超过二十张、适合展示分层结构。所以打法的核心不是炫技,而是把“完整”这两个字做到极致。
以商城为例,常规模块有用户、商品、分类、购物车、订单、支付(模拟)、收货地址。我建议的数据库设计顺序是:先画 ER 图,理清用户和订单是一对多,订单和订单项是一对多,商品和分类是多对一。然后建表时每个表都要有 id、create_time、update_time 这三列,这是基本素养。业务上重点做订单状态流转:待支付、已支付、已发货、已完成、已取消。用状态字段维护,所有状态变更集中写在 Service 层。
这类项目里统一返回结果类的设计也很重要。我使用 ResultCode 枚举加上 Result 泛型类,接口返回永远是这个结构。前端拿到数据时不用散装判断,直接看 code 是否为 200 就行。异常处理用 @RestControllerAdvice 全局兜底,业务异常和系统异常分开处理,返回给前端的错误信息要友好,不能直接把堆栈丢出去。
办公用品管理系统比商城多一层审批流程,这个流程适合用状态模式或者简单的状态字段加状态变更日志表来维护。审批人、申请人、库存变更这些逻辑做好,整个项目就已经撑起来了。
5.2 餐饮 SaaS 与 AI 集成的落地思路
“Spring Boot 餐饮 SaaS AI 集成”这个热词很有时代感。餐饮 SaaS 的典型功能包括门店管理、菜单管理、订单管理、会员管理、库存管理和报表统计。AI 集成的切入点通常集中在智能客服、菜品推荐、评价分析、门店经营建议这几个方向。
落地思路上,不要一开始就把 AI 能力嵌到业务内核里。推荐的做法是把 AI 服务独立成一个内部模块,通过 HTTP 接口或消息队列与主业务系统解耦。比如用户点餐后,订单数据写入主库,同时触发一条消息给分析模块,分析模块调用大模型接口生成菜品推荐,把结果回写到推荐表。这样即使大模型接口不稳定,也不会影响核心点餐流程。
对接大模型接口时要注意成本控制和超时处理。大模型接口通常不是免费的,每次调用都花钱,所以要做缓存和降级策略。菜品推荐结果可以缓存一小时,评论分析结果可以批量异步算。超时时间设短一点,比如 3 秒,超时就直接返回兜底数据。所谓兜底数据,就是基于规则引擎的简单推荐,比如按销量排序。这种“AI 优先,规则兜底”的架构在真实项目里很实用。
5.3 从单体到微服务的演进判断
很多人一提到餐饮 SaaS、商城这类业务就想着上微服务:用户服务、订单服务、商品服务、支付服务,拆得飞起。但我要泼一盆冷水。如果你的团队只有一两个人,或者项目处于验证阶段,单体应用是最合适的选择。Spring Boot 单体应用可以把所有模块都放在一个工程里,用 module 划分边界,一样能保持清晰。
什么时候才真正需要微服务?当你有多个团队并行开发、某个服务需要独立扩容、数据量大到单库扛不住时,才考虑拆。比如餐饮 SaaS 的订单服务和会员服务,订单量大了要单独加机器,会员体系要独立部署给多个门店系统共用,这时候拆出来才有意义。微服务不是目的,复杂度治理才是目的。
即便要拆,也建议先用模块化单体过渡。把用户、订单、商品拆成独立 module,通过内部接口调用。这段演进路径能让你在保持部署简单的条件下,锻炼领域划分能力。等哪天 module 之间的调用边界稳定了,再逐个 module 提升为独立服务,成本会低很多。
6. 常见问题与排查技巧实录
6.1 启动失败的几种高频原因
Spring Boot 项目启动失败,报错五花八门,但根源往往集中在数据源、依赖冲突、端口占用、自动配置异常这几类。数据源报错一般是 Connection refused,先检查数据库服务有没有起、账号密码对不对、yml 里的 url 配置的 IP 和端口是否正确。依赖冲突报错通常出现在引入多个 starter 后,比如同时引了旧版和新版的 Jackson,解决办法是用 Maven 的 dependency:tree 插件分析依赖树,排除掉冗余版本。
端口占用是最让人哭笑不得的问题。本地启动时提示 Port 8080 was already in use,简单粗暴的解决办法是在 yml 里换端口,但更规范的做法是找到占用进程杀掉。Linux 和 Mac 下用 lsof -i :8080,Windows 下用 netstat -ano | findstr 8080,找到 PID 后按系统命令结束进程就行。
还有一类隐蔽问题:自动配置条件不满足。Spring Boot 的自动配置都有 @ConditionalOnXxx 条件,比如 DataSourceAutoConfiguration 依赖类路径里有数据源相关类。如果你的 pom 里少了某个依赖,启动过程不报错,但某个功能一直不生效。排查这类问题,建议开启 debug=true 启动参数,把自动配置的报告打出来,看看哪些条件没有匹配通过。
6.2 版本适配问题的排查套路
版本问题是最磨人的。我这里直接给几个经验性结论。Spring Boot 3.x 对应的 Java 版本最低是 17;Spring Cloud 和 Spring Boot 版本必须成套使用;MyBatis-Plus 对 Spring Boot 3 的支持要看专门的分支版本,不能直接用旧版。还有一个容易被忽略的坑:各依赖内部的传递依赖版本冲突,最终表现往往不是版本报错,而是运行时某个类不存在,比如 NoClassDefFoundError。
排查版本问题我有一套固定流程。第一步,打开 pom.xml,把所有依赖的 version 统一整理出来;第二步,用 Maven Helper 插件检查冲突,idea 里直接看 pom 的 dependency analyzer;第三步,锁定冲突的依赖,在 pom 里用 exclusion 排除传递依赖,或者用 dependencyManagement 强制指定版本;第四步,每次调整后 clean 一次再重启,直接增量编译容易残留旧的 class。
对于像 OpenFeign 和 QueryDSL 这类第三方库的版本对应,最靠谱的方式是直接查看官方 GitHub 仓库的 README 或者 Release Notes,上面的 Compatibility 表格一般会写明支持哪些 Spring Boot 版本。网上搜到的博客版本号只能作为参考,因为项目维护者可能更新了但博客没更新。
6.3 我踩过坑之后的自用排查清单
这里分享一份我每次开发新 Spring Boot 项目都会自己过一遍的清单,配合上面的内容,能省掉大部分低级错误的时间。
第一,以真实需求列表为基线,建一个 README 的需求清单,每个功能完成后勾选,避免漏功能。很多设计题目项目扣分都是因为功能缺失而非代码质量。
第二,接口设计先定返回结构、再写代码。先定义统一 Result 结构并用于所有接口。接口的请求参数、响应参数要写清楚含义,不要把参数设计得既当查询条件又当排序字段。
第三,测试用例至少覆盖登录、CRUD、异常拦截和缓存命中。即便没时间写所有测试,登录和 CRUD 主流程测试一定保留。在 CI 上加一个 mvn test 的步骤,每次构建跑一遍,能尽早发现问题。
第四,上线前检查 active profile。生产环境配置里绝不出现本地数据库地址或测试的配置。很多人上线时都因为 spring.profiles.active 写错,结果本地开发库被生产流量打爆。
第五,重视启动日志的最后一个异常。启动失败时,控制台会打出一大堆堆栈,很多新手去看堆栈中间的内容,结果被绕晕。实际上,最关键的信息通常在堆栈的最后几行,它直接告诉你哪个配置或依赖加载失败了。
7. 写在最后的实操心得
这篇文章覆盖的内容不少,从脚手架搭建、Bean 注入、日志配置,到 CRUD 模块、缓存、WebSocket、Spring Security 迁移、RPC 版本适配,再到商城、办公用品管理、餐饮 SaaS 这类典型场景,基本把一个 Spring Boot 项目从立项到上线的完整路径走了一遍。真正常用的技术点万变不离其宗:分层清晰、配置规范、日志完整、版本可控。
我个人在这些项目里最大的体会是:Spring Boot 的上手难度真的不高,但把它用好,靠的是对各种细节的把控。网上搜到的片段只能告诉你某一个点怎么解决,但真正的实战能力来自把每个模块串起来的能力。你可能已经发现,整条链路里最花时间的不是写 CRUD,而是版本、配置、依赖、异常这些“小事”。我也一样,从第一个项目到现在,踩过最多的坑恰恰都集中在这些地方。
最后再分享一个小技巧:如果你准备做设计题目或者公司内部小项目,建一张多环境配置表,把本机、测试、生产的数据库地址、缓存地址、日志级别都写清楚,全局共享。项目如何不混乱,从这张表开始。这套 Spring Boot 全流程的打法,我用了很久,希望也能帮你的项目顺利跑起来。