# 《手写Spring:渐进式源码实践》—— 小傅哥新书上市!教你把Spring当成项目从零开发。

作者:小傅哥
博客:https://bugstack.cn (opens new window)
图书:https://u.jd.com/4LapTH4 (opens new window)

沉淀、分享、成长,让自己和他人都能有所收获!

# 一、前言:技术顶峰

IOCAOPSPI,Spring 给你的不只是一个开发框架,还包括它的设计思想。它通过解耦 Bean 对象的实例化过程,管理 Bean 的生命周期,来维护你在程序开发中所需对象使用过程。让你不需要刀耕火种般 new 一个对象,也不需要如 EJB 一样笨重臃肿的开发维护,而像春风一样润物(万物皆可Bean)细无声的使用。因此可以说它完全担得起 Java 技术设计的顶峰

除了运用以外,Spring 框架也是众多码农,最能最先接触到的一个源码级复杂项目。任何初出新手村蜕变的码农,寻觅苦找的锻炼项目,都不如学习 Spring 源码来的痛快。从架构设计的复杂、从分治抽象的运用、从设计模式的驾驭,Spring 框架都是顶级的,也是最能给你带来丰富收获的。

但学习 Spring 源码难吗?难,难到编程个1-2年的研发,也不知道从哪下手学习。看到大部分资料和书籍也都是从一个知识点直接透析到骨头。没有阅读源码经验的小白,根本没法如编写者感同身受般学习,云里雾里一样的看,过眼云烟一样的忘。

为啥会这样,因为 Spring 发展太久了,源码太大了,主干核心源码外的繁枝末节有太多太多。就像沙发🛋左移套个套,套上盖罩,罩上铺块小布料。但除了沙发以外的套、罩、布料对初学源码的研发来说,并没有那么重要。我要的就是最初的沙发,最开始的木板,看看它的结构,闻闻它的味道。

所以,如果你想真的把 Spring 这个源码级复杂框架的设计和实现精髓吸收喽,就应该像开发一个项目一样,跟着小傅哥写一遍。只有这个项目是你写的,你才能知道哪些细节是如何处理的,那些设计是如何驾驭的。

# 二、驾驭:复杂源码

对于大部分使用 Spring 框架的研发人员来说,可能在遇到 Spring 框架的报错提醒, 以及需要基于 Spring 框架开发 SpringBoot Starter 等技术类组件时,都会尝试阅读 Spring 框架的源码。由于 Spring 框架的源码庞大、复杂,也不像平常的业务流程代码开发一样 具有分层结构,并且其中还使用了大量的设计模式,所以阅读难度较大。研发人员很难厘清其中的调用链路和各个类之间的关系。

小傅哥在最初学习Spring时,也阅读了不少关于 Spring 的图书,在反复学习后,仍然不能轻易理解 Spring 框架中各个功能的实现细节。其中一个原因是自己没有手动实现,只阅读了图书,很难完全掌握 Spring 框架的精髓。

因此,小傅哥采用从零手写 Spring 的方式,摒弃 Spring 源码中繁杂的内容,选择整体框架中的核心逻辑,简化代码实现过程,保留核心功能,如 IOC、AOP、Bean 的生命周期、上下文、 作用域和资源处理、事务等。在开发过程中,细化功能模块,逐步完成一个简单版的 Spring 框架。

在学习过程中,小傅哥对 Spring 框架有了非常深入的了解和认识,也体会了更多精妙的设计原则和设计模式。彻底从实现上搞清楚;上下文如何管理、Aware如何通过SPI机制处理感知对象通知、切面拦截如何设计、三级缓存循环依赖如何实现、ORM框架怎么整合到Spring等等。

所以,把关于手动实现简单版 Spring 框架的内容编写成书,希望可以帮助更多的研发人员学习 Spring 源码,编写出有价值的源码设计方案。

# 三、案例:学以致用

《手写Spring》完成后我的能力如何体现?给个案例。

  1. 体现在专业技能上,例如; 1.1 深入学习 Spring 核心流程模块,包括;IOC、AOP、依赖倒置等流程,掌握Spring解决复杂场景所运用的分治、抽象和知识(设计模式、设计原则),在解决Spring场景问题时,可以从核心原理上给出方案。同时也具备基于 Spring 开发 SpringBoot Starter 技能,为复杂项目减少同类共性需求的开发,凝练通用的技术组件,减少研发成本。 1.2 深入学习 MyBaits 核心流程模块,包括;会话、反射、代理、事务、插件等流程,熟练掌握 ORM 框架的设计思想、实现方式和应用价值。并能按需结合 MyBatis 的插件机制,开发属于企业自己所需的功能,包括;数据分页、数据库表路由、监控日志、数据安全等方面。

  2. 体现在项目经验上,例如;—— 对校招和实习比较有用 把 Spring、MyBatis 当一个学习项目来描述,这是你在离校前,最可能接触到的一个完整的、成型的、知名的,有企业使用的,框架。你就按照自己学习并开发了这样一个框架为目标来写项目,并描述出这个项目,你用了什么技术栈,解决了什么问题,学习到了哪些。

  3. 体现在项目应用上,例如; 关于 Spring、MyBatis 的项目,一般都是插件类开发,比如各类的 SpringBoot Starter,MyBatis 插件,都是基于框架的深入整合类技术解决方案,体现在简历上,非常抓眼球。一看你就是有深度和自研能力的研发人员。—— 一般不让你造轮子,但需要你有造轮子的能力,这样企业中一些软件可以被你进行优化和修改。

  4. 体现在解决问题是上,例如; 在你的自己的业务项目中,渗入一些关于解决了原项目使用 Spring 时,关于感知 Aware 方式或者结合 FactoryBean 包装对象等,所遇到的问题,因为你学习过源码,所以非常清晰这样的流程,因此解决了一个问题。通用 MyBatis 也适用于这样的描述方式,包括;事务、查询次数、批查询、插件能监听到的四个类(ParameterHandler、ResultSetHandler、StatementHandler、Executor )你给了更好的选择。

# 四、新书:五折下单

好!那么独乐不如众乐,我给你掌握源码的机会,也给你名正言顺的初出。

从此你的简历就是可以写一段《手写Spring》项目学习;我就是掌握了复杂源码的架构设计能力、我就是吸收了复杂场景分治和抽象的思想、我就是学会了复杂结构中设计模式的运用。聊 Spring 聊的就是你手写的代码,有什么不会的,来你问吧。以后路,你可以横着走!

本书共21章;

  • 第1 - 10章:主要介绍IOC 容器,逐步完善一个简单的Spring Bean 容器的相关功能,引入实例化策略、注入属性和依赖、设计应用上下文、处理Bean 对象的生命周期,以及实现感知容器对象的监听等。
  • 第11 - 12章:主要介绍AOP 切面,基于JDK、Cglib 的动态代理、方法拦截、切点表达式等技术,将代理与Spring Bean 容器整合,提供AOP 切面功能。
  • 第13 - 17章:扩展简单版Spring 框架的自动化功能,完成自动扫描注册、注解和代理注入,以及通过三级缓存处理对象的循环依赖等功能。
  • 第18 - 21章:基于简单实现的Spring 框架整合JDBC、事务的功能,开发一个简单版的ORM 框架,并将ORM 框架整合到Spring Bean 容器中,介绍自定义代理对象的扫描和注册过程。

本书主要通过渐进式开发功能模块,以实现开发整个Spring 框架的核心源码。首先,每章开头都会列出难度和重点;然后,正文中会介绍要处理的问题、具体设计和实现代码;最后,给出测试验证和本章总结。

# 五、地图:框架全貌

读者在学习过程中,可以参考书中 Spring 框架地图,通过全局的视角,可以更好地理解和学习 Spring 框架的设计与开发。

# 六、活动:回馈粉丝

牛吹完了,接下来回馈粉丝签名版《手写Spring》5本,感谢一直以来对小傅哥的支持。

# 1. 得奖规则

  • 对文章进行留言并转发朋友圈,找伙伴给你的留言点赞
  • 以个人留言被读者点赞数量为排名,取最高的前5名
  • 仅记录个人攒点最高的留言,多次留言取最多次

# 2. 活动说明

  • 时间范围:2022-11-07 07:55:00 - 2020-11-09 07:55:00,共计2天计票
  • 公布时间:2022年11月09日,星期三
  • 公布方式:小傅哥的朋友圈公布,记得添加小傅哥微信:fustack
  • 领奖方式:看到小傅哥朋友圈后,主动联系小傅哥。提供;收获人、收获地址、手机号等必要信息。😄嘿...嘿,我会保密的你的信息!

# 七、感谢:专家评语

感谢;G哥、冰河、CSDN蒋涛总、赖帆、刘俊明国科大导师、孙浩京东科技移动研发部垂直业务负责人、王松、翟永超、Hollis。帮写推荐语。感谢对小傅哥的喜欢和支持。

# 八、心似:平原走“码”

若焰晨星,无量黎明。绽燃何须喧闹,灿烂不惧寂寥。我就愿意做一个心似平原走马的人,也更享受那份安静的执着。我也希望以我的经验分享给这条路上的同好。

小傅哥,13年毕业,男,热衷于钻研有深度的技术本质。目前担任大厂互联网架构师职责,全网30万粉+编程知识博主,持续分享有干货有质量的技术。

一个着迷于技术又喜欢不断折腾的技术活跃者,从13年毕业到进入互联网,开发过交易、营销类项目,实现过运营、活动类项目,设计过中间件,组织过系统重构,编写过技术专利。不仅从事业务系统的开发工作,也经常做一些字节码插桩类的设计和实现,对架构的设计和落地有丰富的经验。在热衷于Java语言的同时,也喜欢研究中继器、I/O板卡、C#和PHP!

沉淀、分享、成长,让自己和他人都能有所收获!