作者:小傅哥
博客:https://bugstack.cn
图书:https://u.jd.com/4LapTH4
沉淀、分享、成长,让自己和他人都能有所收获!
一直都有一个非常好的硬核项目在你我身边,复杂的架构、优秀的设计、强悍的实现。如果能跟着实现一遍,编码能力至少提升3年!
这个项目就是 Spring 框架,你想过把它当成自己的项目手写一遍吗?
一、它是:技术顶峰
IOC
、AOP
、SPI
,Spring 给你的不只是一个开发框架,还包括它的设计思想。它通过解耦 Bean 对象的实例化过程,管理 Bean 的生命周期,来维护你在程序开发中所需对象使用过程。让你不需要刀耕火种般 new 一个对象,也不需要如 EJB 一样笨重臃肿的开发维护,而像春风一样润物(万物皆可Bean
)细无声的使用。因此可以说它完全担得起 Java 技术设计的顶峰。
除了运用以外,Spring 框架也是众多码农,最能最先接触到的一个源码级复杂项目。任何初出新手村蜕变的码农,寻觅苦找的锻炼项目,都不如学习 Spring 源码来的痛快。从架构设计的复杂、从分治抽象的运用、从设计模式的驾驭,Spring 框架都是顶级的,也是最能给你带来丰富收获的。
但学习 Spring 源码难吗?难,难到编程个1-2年的研发,也不知道从哪下手学习。看到大部分资料和书籍也都是从一个知识点直接透析到骨头。没有阅读源码经验的小白,根本没法如编写者感同身受般学习,云里雾里一样的看,过眼云烟一样的忘。
为啥会这样,因为 Spring 发展太久了,源码太大了,主干核心源码外的繁枝末节有太多太多。就像沙发左移套个套,套上盖罩,罩上铺块小布料。但除了沙发以外的套、罩、布料对初学源码的研发来说,并没有那么重要。我要的就是最初的沙发,最开始的木板,看看它的结构,闻闻它的味道。
所以,如果你想真的把 Spring 这个源码级复杂框架的设计和实现精髓吸收喽,就应该像开发一个项目一样,跟着小傅哥写一遍。只有这个项目是你写的,你才能知道哪些细节是如何处理的,那些设计是如何驾驭的。
二、简历:学以致用
《手写Spring》完成后我的能力如何体现到简历上?给个案例。
如果面试挑战你写Spring为啥?:我写spring,不是为了再造一个轮子。是为了吸收更好的架构和设计思想,面试官你们公司有那个项目的架构级别能对标Spring吗,我可以学学。那么这样的技术运用到实际项目,既可以解决业务的耦合实现,提升交付质量,又可以扩展插件,降低重复建设。难道不好吗?
- 体现在专业技能上,例如;
- 深入学习 Spring 核心流程模块,包括;IOC、AOP、依赖倒置等流程,掌握Spring解决复杂场景所运用的分治、抽象和知识(设计模式、设计原则),在解决Spring场景问题时,可以从核心原理上给出方案。同时也具备基于 Spring 开发 SpringBoot Starter 技能,为复杂项目减少同类共性需求的开发,凝练通用的技术组件,减少研发成本。
- 深入学习 MyBaits 核心流程模块,包括;会话、反射、代理、事务、插件等流程,熟练掌握 ORM 框架的设计思想、实现方式和应用价值。并能按需结合 MyBatis 的插件机制,开发属于企业自己所需的功能,包括;数据分页、数据库表路由、监控日志、数据安全等方面。
- 体现在项目经验上,例如;—— 对校招和实习比较有用
把 Spring、MyBatis 当一个学习项目来描述,这是你在离校前,最可能接触到的一个完整的、成型的、知名的,有企业使用的,框架。你就按照自己学习并开发了这样一个框架为目标来写项目,并描述出这个项目,你用了什么技术栈,解决了什么问题,学习到了哪些。 - 体现在项目应用上,例如;
关于 Spring、MyBatis 的项目,一般都是插件类开发,比如各类的 SpringBoot Starter,MyBatis 插件,都是基于框架的深入整合类技术解决方案,体现在简历上,非常抓眼球。一看你就是有深度和自研能力的研发人员。—— 一般不让你造轮子,但需要你有造轮子的能力,这样企业中一些软件可以被你进行优化和修改。 - 体现在解决问题是上,例如;
在你的自己的业务项目中,渗入一些关于解决了原项目使用 Spring 时,关于感知 Aware 方式或者结合 FactoryBean 包装对象等,所遇到的问题,因为你学习过源码,所以非常清晰这样的流程,因此解决了一个问题。通用 MyBatis 也适用于这样的描述方式,包括;事务、查询次数、批查询、插件能监听到的四个类(ParameterHandler、ResultSetHandler、StatementHandler、Executor )你给了更好的选择。
三、教你:驾驭源码
对于大部分使用 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 框架地图,通过全局的视角,可以更好地理解和学习 Spring 框架的设计与开发。
若焰晨星,无量黎明。绽燃何须喧闹,灿烂不惧寂寥。我就愿意做一个心似平原走马的人,也更享受那份安静的执着。我也希望以我的经验分享给这条路上的同好。—— @小傅哥