作者:小傅哥


博客:https://bugstack.cn


图书:https://u.jd.com/4LapTH4

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

一直都有一个非常好的硬核项目在你我身边,复杂的架构、优秀的设计、强悍的实现。如果能跟着实现一遍,编码能力至少提升3年!

这个项目就是 Spring 框架,你想过把它当成自己的项目手写一遍吗?


一、它是:技术顶峰

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

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

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

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

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

二、简历:学以致用

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

如果面试挑战你写Spring为啥?:我写spring,不是为了再造一个轮子。是为了吸收更好的架构和设计思想,面试官你们公司有那个项目的架构级别能对标Spring吗,我可以学学。那么这样的技术运用到实际项目,既可以解决业务的耦合实现,提升交付质量,又可以扩展插件,降低重复建设。难道不好吗?

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

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

  2. 体现在项目应用上,例如;

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

  3. 体现在解决问题是上,例如;

    在你的自己的业务项目中,渗入一些关于解决了原项目使用 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 框架的设计与开发。


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

手写 Spring,写到简历上被怼?的更多相关文章

  1. 手写Spring MVC

    闲及无聊 又打开了CSDN开始看一看有什么先进的可以学习的相关帖子,这时看到了一位大神写的简历装X必备,手写Spring MVC. 我想这个东西还是有一点意思的 就拜读了一下大佬的博客 通读了一遍相关 ...

  2. 【Spring】手写Spring MVC

    Spring MVC原理 Spring的MVC框架主要由DispatcherServlet.处理器映射.处理器(控制器).视图解析器.视图组成. 完整的Spring MVC处理 流程如下: Sprin ...

  3. 我是这样手写 Spring 的(麻雀虽小五脏俱全)

    人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...

  4. 手写 Spring

    手写 Spring 不多说,简历装 X 必备.不过练好还是需要求一定的思维能力. 一.整体思路 思路要熟练背下来 1)配置阶段 配置 web.xml: XDispatchServlet 设定 init ...

  5. 手写Spring框架,加深对Spring工作机制的理解!

    在我们的日常工作中,经常会用到Spring.Spring Boot.Spring Cloud.Struts.Mybatis.Hibernate等开源框架,有了这些框架的诞生,平时的开发工作量也是变得越 ...

  6. 手写Spring+demo+思路

    我在学习Spring的时候,感觉Spring是很难的,通过学习后,发现Spring没有那么难,只有你去学习了,你才会发现,你才会进步 1.手写Spring思路: 分为配置.初始化.运行三个阶段如下图 ...

  7. Spring事务原理分析--手写Spring事务

    一.基本概念和原理 1.Spring事务 基于AOP环绕通知和异常通知的 2.Spring事务分为编程式事务.声明事务.编程事务包括注解方式和扫包方式(xml) Spring事务底层使用编程事务(自己 ...

  8. 手写Spring事务框架

    Spring事务基于AOP环绕通知和异常通知 编程事务 声明事务 Spring事务底层使用编程事务+AOP进行包装的   = 声明事务 AOP应用场景:  事务 权限 参数验证 什么是AOP技术 AO ...

  9. 先搞清楚这些问题,简历上再写你熟悉Java!

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  10. -手写Spring注解版本&事务传播行为

    视频参考C:\Users\Administrator\Desktop\蚂蚁3期\[www.zxit8.com] 0018-(每特教育&每特学院&蚂蚁课堂)-3期-源码分析-手写Spri ...

随机推荐

  1. The Cluster ID Zc7nlyfTQ5qPbhY2d8I_3A doesn't match stored clusterId Some(ZvQZIX9gTB-dj05be_i_-w) in meta.properties.

    启动kafka时报错(部分信息): [2022-05-12 20:26:05,589] INFO Cluster ID = Zc7nlyfTQ5qPbhY2d8I_3A (kafka.server.K ...

  2. #1198:Farm Irrigation(DFS + 并查集)

    Farm Irrigation **Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...

  3. POJ 2484博弈——对称法

    题目链接:http://poj.org/problem?id=2484 题意:Alice和Bob玩游戏,从一堆圆环形排列的硬币中拿硬币,每次可以拿一个或者两个,但必须拿连续的(两个中间有空位也视为不连 ...

  4. Problem 330A - Cakeminator (思维)

    330A. Cakeminator https://codeforces.com/problemset/problem/330/A 题意很容易理解:给定一块蛋糕区域,但蛋糕上有几个不能吃的草莓,大胃王 ...

  5. 消息服务 + Serverless 函数计算如何助力企业降本提效?

    作者 | 柳下 背景介绍 消息队列服务(下文均以 Message Service 命名)作为云计算 PaaS 领域的基础设施之一,其高并发.削峰填谷的特性愈发受到开发者关注.Message Servi ...

  6. 三、swift大对象--动态大对象

    系列导航 一.swift对象存储环境搭建 二.swift添加存储策略 三.swift大对象--动态大对象 四.swift大对象--静态态大对象 五.java操作swift对象存储(官网样例) 六.ja ...

  7. echarts自定义legend样式

    https://blog.csdn.net/changyana/article/details/126281275

  8. 开发中history和location

  9. 大四上 | 计算机综合课设(OS)· 答辩经验帖

    课设代码 repo 被问了如下问题: 我们的 OS 中是否有 idle 进程. 背景:如果所有进程都被 kill 掉了,那么 os 就会陷入死循环.即使再发生需要响应的事情,比如希望再创建个进程 或者 ...

  10. influxdb 端点使用http进行sql查询,写数据

    转载请注明出处: InfluxDB有以下几个常用的端点,它们的作用和传参方式如下: 1./ping 端点: 作用:用于检查InfluxDB实例的状态,返回InfluxDB的构建类型和版本信息. 传参: ...