SSM 作为 Java 开发领域的经典框架组合,作为一个有追求的技术人,都是有必要认真去走一遍 Spring 源码的,搞懂 Spring 源码,不仅仅是为了掌握 Spring,也是为了学习其中优秀的设计思想。
可以这么说,如果你看懂了 Spring 源码,再去看 MyBatis、Spring Security 源码,你会发现这些源码都非常容易,稍微瞅几眼就懂了。
然而源码的学习是一个枯燥的过程,源码解读也是一个枯燥的过程,但是一旦你把源码搞懂了,技术上的提升也绝对是肉眼可见的,所以,去折腾一下源码绝对是有必要的,这也是你和同行拉开差距的方式之一。
松哥自己在 Spring 源码这块前前后后也折腾了很久了,有一些心得一直想和大家分享,但却总下不了决心,因为现在已经很忙了,再加塞一个任务进来,怕是吃不消,但是很多时候,我们总得逼自己一把,才能成长,不能总是躺在舒适区。于是下定决心,这次一定要把 Spring 源码解析的视频录出来。
然而视频录制是一个非常费时费力的事情,有的人可能不太理解为什么视频会更加费时间,松哥来给大家举几个例子:
- 视频的案例,需要提前准备,不是讲的时候边讲边写,那样是不负责任的,对自己不负责,对读者也不负责。录视频和写博客一样,案例都是要先经过设计的:
这个知识点,我用一个什么样的 Demo 才能让读者更好的理解它?
- 视频可能还需要准备一个配套的文档,文档的撰写跟写博客一样,得不少时间。
- 视频录完之后,一般都要二次处理一下,去噪音等等,二次处理耗时和计算机性能有很大关系,这也是一个耗时操作。
所以要把一个自己懂的东西讲出来,同时还要让听讲的人听懂,这并非一件容易的事情。
松哥思来想去,决定在视频开始录制之前,先出一系列源码解读的文章,通过图文的形式先带领大家进入 Spring 源码的世界,然后再抽时间录视频,这样感觉更稳一些。
所以今天这篇文章,我主要和大家说一下我的 Spring 源码解读计划,大概从哪几个方面入手。
1.Spring 架构
先来看一张 Spring 整体架构图:
从这张图中,我们可以看到,Spring Framework 中包含的东西还是非常多的,虽然东西很多,但是主次其实很明显。
我们在学习 Spring 的时候,有两个非常重要的地方:
- Core Container
- AOP
这两个是核心,也是我们到时候源码分析的重点,其他的 Data Access 、Web 等,基本都是以这两个为基础扩展出来的功能。
我来给大家挨个介绍一下。
2.Spring 模块
2.1 Core Container
Core Container 是 Spring 容器的核心模块,里边主要包含四个模块:Beans、Core、Context 以及 Expression Language,我们所熟知的 IoC/DI 就是由 Beans 和 Core 来提供。
我来分别介绍一下这几个模块的作用。
- Core:这个是 Spring 的核心模块,它里边主要是 Spring 框架的一些基础工具类,比如一些序列化工具、类型转换器、我们常用的优先级注解等等,都是它提供的。
- Beans:Beans 就没啥好说的,我们所熟知的 IoC/DI 就是由它提供的。
- Context:Context 虽然不像前两个模块那么基础,因为它是基于 Core 和 Beans 构建的,但是 Context 也是我们在 Web 项目中必不可少的工具,资源加载、Event 等等都需要 Context。
- Expression Language:SpEL 虽然归类于 Core Container,但是在目前前后端分离的背景下,其实 SpEL 的使用场景大大缩水。SpEL 是一个支持查询并在运行时可以操纵一个对象图的表达式语言,它的语法类似于统一 EL,但提供了更多的功能,而且它可以独立使用。
2.2 AOP
AOP 也是 Spring 中一个非常重要的功能模块,其实小伙伴们从平时的面试中应该就能感觉出来 AOP 的分量,可以说,如果没有 AOP,你就见不到 Spring 中很多令人惊叹的功能。像我们熟知的 Spring 中的事务管理,就离不开 Spring AOP。关于 AOP 的更多介绍,大家可以参考已经录制的 【Spring 基础篇】的视频,我就不再赘述。
2.3 Data Access
Data Access 模块中,主要是封装了一些数据库持久化相关的操作。比如 JDBC、ORM、OXM、JMS 以及事务。
- JDBC:这个是对传统的 JDBC 的封装,传统的 JDBC 里边有很多冗余代码,Spring 利用自身特性对其进行封装,简化了数据库访问。
- ORM:ORM 为我们常见的 ORM 框架(如 Hibernate、MyBatis 等)提供了一个交互层。
- OXM:OXM 模块抽象了对象和 XML 之间的转换,O 是 Object,X 是 XML。
- JMS:JMS 主要是对消息中间件的消息发送/消费提供封装。
2.4 Web
Web 模块里边包含几个部分,不过对于我们而言,使用更多的是 webmvc,也就是我们常说的 SpringMVC。
Web 主要包含如下模块:
- Web:提供基础的 Web 功能,构建 Web 上下文、提供文件上传等功能。
- WebMVC:提供 MVC 支持。
- 其他一些冷门的模块我就不多做介绍了。
2.5 Test
对测试功能提供支持。
3.小结
好啦,这篇文章就先和大家稍微聊一下 Spring 中的各个模块,接下来将按照本文的顺序和大家逐步剖析 Spring 源码,其中 Ioc/DI、AOP 将是分析的重点。
最后我把我收集的各大厂经典高频面试题和Java高级进阶、架构师视频教程送予大家。部分资料如下图所示: