这些年,Spring 几乎是 Java 开发的标配,好用归好用,但确实也有不少坑,很多“坑”隐藏的还相当隐蔽,下面这些问题,估计你都遇到过:
1、我们在给一个接口类添加了 @RestController 注解时,有时候难免会想,换成 @Controller 可以么?到底用哪个更好?
2、遇到一个过滤器(Filter)不按我们想要的顺序执行时,通常都是立马想到去加 @Order,但是 @Order 不见得能搞定所有的情景呀。此时,我们通常会抓狂地胡乱操作,把各种注解来一遍,最终顺序可能保证了,但是每个过滤器都执行了多次。
3、为什么我们只是稍微“动”了下,就出故障了呢?例如,新手常遇到的一个错误,在 SpringBoot 中,将 Controller 层的类移动到 Application 的包之外,此时 Controller 层提供的接口就直接“失效”了。
4、当我们遇到问题时,该从何查起?例如,下面这段代码在一些项目中是可以的,但是换成另外一个项目又不可以了,这是什么情况呢?
这些问题都源自哪里呢?说到底,还是因为 Spring 实在太“贴心”了。它就像一个“保姆”,把我们所有常见的工作都完成了,如果你幸运的话,可能很久都不会遇到问题。
但是,这份贴心是建立在很多“约定俗成”的规则之上的。就像你家保姆她可能一直假定,你是吃中餐的,所以每次你下班回家,中餐就已经做好了。但忽然有一天,你临时兴起想吃西餐,你才会发现这个贴心的保姆她只会做中餐。
Spring 就是这样,它有很多隐性的“约定”,而这些约定并不一定是你所熟悉的。所以,当你遇到问题时,很有可能就抓狂了。一方面我们得益于它所带来的轻松,因为不需要了解太多也能工作;另一方面也会崩溃于问题来临之时,无法快速解决,因为我们平时根本不需要,甚至不觉得要了解更多。
不想在遇到问题时疲于奔命,需要一些行业大佬的指点。市面上有很多 Spring 教程,专门讲“避坑”的并不多,我最近在看的,是极客时间新上线的《Spring 编程常见错误 50 例》,思路很清晰,是以问题驱动的方式来组织知识点的:
作者是「傅健」,思科的高级工程师,还是 Netty 源码贡献者。了解过他的履历后,才觉得人家确实有资本。他是一名用 Spring 10 年的资深工程师了,10 年前啊,Spring 还不火的时候就开始了解,可以说见证了这些年 Spring 的发展和变革,就冲这一点,就很厉害了。
他写过书《度量驱动开发》,也做过很多项目,从移动端应用到文档存储系统,消息系统到电话接入系统等,可以说在工作中大量使用和依赖 Spring。
所以他基于真实业务场景,整理出 50 个“Spring 的踩坑”案例,给出问题的最佳解决方案,以「线上案例合集」的方式交付,还详细讲了 Spring Web 关键处理流程。对于新人来说,这是份全面的避坑指南;对于老人来说,是个很实用的踩坑备忘录。
说句实在的,预见问题的能力是需要日积月累的,最终能及时规避和快速处理问题,才是硬道理。
还有一点,不得不提,说是“避坑备忘录”,但知其然,方知其所以然,他还详解了 Spring 核心技术及源码拆解,让你在碎片化的时间里,能吃透每个问题背后的原理。由点到面,通过 50 多个常见、典型的问题,了解 Spring 的本质,而对于产生问题的原因,也能做到洞若观火。最终掌握这些问题的最佳解决方式,触类旁通。
再来简单说说,这个专栏怎么设计的。
共分为 3 个部分,你可以对照着下面这张图去理解整体的设计思路:
Spring Core 篇:包括 Bean 定义、注入、AOP 等核心功能,它们是 Spring 的基石。不管未来是你做 Spring Web 开发,还是使用 Spring Cloud 技术栈,你都要绕不开这些功能。所以这些功能使用上的常见问题,都会重点介绍。
Spring Web 篇:大多项目使用 Spring 还是为了进行 Web 开发,专栏贴心的梳理了从请求 URL 解析、Header 解析、Body 转化到授权等 Web 开发中绕不开的问题。它们正好涵盖了从一个请求到来,到响应回去这一完整流程。
Spring 补充篇:这部分重点介绍 Spring 测试、Spring 事务、Spring Data 相关问题。最后还会系统总结下 Spring 使用中发生问题的根本原因。
学完这个专栏后,你将获得:
-
拿来即用的 Spring 编程备忘录
-
Spring 核心技术及源码拆解
-
Spring Web 关键处理流程详解
-
Spring 开发 50+ 常见问题解决方案