手把手带你写一个 MiniSpring
郭屹
前 Sun Microsystems Java 研发工程师,开源软件 MiniSpring、MiniTomcat 开发者
6170 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
手把手带你写一个 MiniSpring
15
15
1.0x
00:00/13:55
登录|注册

开篇词|“眼脑手”结合,搞定Spring框架底层原理

讲述:郭屹大小:12.71M时长:13:55
你好,我是郭屹,一名深耕软件开发行业 30 年的老兵。欢迎你跟我一起手写 MiniSpring,一个 mini 版的 Spring 框架。
在正式开始学习之前,我先介绍下我自己。说起来,我与 Java 和 Spring 打交道也有二十几年了。1998 年我就加入了 Sun Microsystems 的 Java 团队,担任 J2EE 研发工程师,并在那里了解了 Java 专家 Rodd Johnson、James Gosling 等人的思想,见识了这些行业大牛的功力。
我就像是一个跟随哥伦布船队的小船员,有幸亲眼见证了这段精彩的历史。而这些经验和知识也深深影响了我的职业生涯,目前我依然活跃在代码一线,对 Java 和 Spring 的热爱依旧不减。
而这些年我在编程的同时,也一直在坚持写作,先后出版了《认识编程》《Java 编程十五讲》《三字经注解》几本书,同时也很荣幸地成为了机械工业出版社专家委员会委员。对编程和写作多年的坚持,让我在技术实践与内容分享方面逐渐形成了一个正向的循环,总是喜欢把自己在技术方面的心得和实践转化成系统的知识。为此,我先后开发了 MiniSpring,MiniTomcat,MiniRedis,MiniLanguage 等几款开源软件,就是希望将这些知识传递给更多的人。
希望我的讲解能为 Java 和 Spring 布道,对你有所帮助。我将从 IoC 容器开始,带你一步步深入,直到完成一个属于自己的 MiniSpring。希望你坚持下去,迈上一个崭新的台阶,到了那时,定会体会到“胸中自有沟壑”的美妙境界。

为什么建议你学习 Spring 底层原理?

现在这个时代,信息过载,选择过多,技术领域中各种新技术新工具层出不穷,让初学者不知从哪里下手,甚至都不知道该不该学某些技术,产生了许多困惑。那么哪些技术是我们应该花时间花精力去好好琢磨的呢?
众所周知,Java 诞生二十几年来,一直是业界的主流语言和平台。而 Spring 则是 Java 开发的事实平台,我们说用 Java 编程,其实是在 Spring 框架上编程。即便最近几年进化到用分布式架构如 Spring Cloud 进行开发,它的底层内核仍然是 Spring 框架。因此,作为专业程序员,深度理解 Spring Framework 是很必要和重要的。对 Spring 这个基础框架的理解,能让我们以不变应万变,把握住技术快速流变中相对稳定的内核
而我们平时的工作中,大部分的时间都是在调用工具包,快速搭建出客户所需要的应用程序,没有意识到需要了解底层原理。那为什么我们还要费力了解 Spring 的内部结构呢?对这个常见的困惑,我是这么看待的:站在应用程序的角度,不理解所用工具的原理,不太会影响你构建应用程序的进度。但是,理解了原理,你就知道了所以然,工作过程中会更加高效准确地使用平台工具,提高应用程序的质量,如结构的扩展性和需求变化的适应性。
俗话说,下棋找高手,弄斧到班门。在学习 Spring 框架的过程中,分析程序结构,阅读源代码,还能让我们体会到世界顶级程序员作品的精妙之处。我们可能达不到他们那种高度和深度,但是通过学习、模仿,也能让我们的水平有本质的提升。
更进一步,我们自己在工作中,了解了这些底层技术,就会有意识地去借鉴这些大师们的结构,让我们自己能承担更加困难、更加复杂的工作。比如,当我们应对各种用户需求,编写增删改查等类似程序的时候,就可以回想一下,Spring 框架中是如何管理用户业务,如何抽象出 Bean 这个概念,以及定义 Bean 的生命周期的,我们可以通过模仿这种技巧,提出业务表单的概念,定义它的生命周期,然后构造一个业务框架,让用户自定义表单,注册进框架,由框架自动管理运行它。现在,市面上很多成功的 OA 产品就来自这个简单的模仿。
当我们的工作到达了系统框架这个级别的时候,你就会时不时地想起那些大师的作品,如 Spring 框架、Tomcat、JDK、Redis 等等,他们如何用简洁的模型、统一的技术栈,来处理千变万化的应用。他们的设计原则和模式,他们宏大的架构考量,他们的代码技巧,会给我们丰富的养分,带领我们走向专业之路。

如何高效地掌握 Spring 原理?

今天,我们在学习 Spring 的过程中,面对的一个问题是它已经是一个庞大而复杂的体系了,虽然它是开源的,代码之下了无秘密,但是面对源代码的汪洋大海,很多技术人经常会迷失其中,因一次次的挫败而导致最后只有望洋兴叹。但是回顾历史,Spring 并不是生下来就是这么庞大的,它也是从小一步步长大的。作为后来者,我们的问题是只见到了长大后的 Spring,没有了解到它是怎么成长起来的。失去了这个过程,就会让学习的路径变得很艰难。
其实 Spring 的发明者 Rodd Johnson,开头的想法很简单,只是希望有一个简单的框架让程序员专注于自己的业务开发,通过框架的配置就能让不同业务单元组合在一起。这个想法其实在 Sun 公司 Java 团队提出的 EJB 中就有了充分的考虑。但是 Rodd Johnson 认为 EJB 过于庞大复杂,而且是侵入式的,会对上层程序员有很多限制,他对 EJB 进行了激烈地批评并决心构建一个小的框架,于是跟 Java 团队分道扬镳,这是我当时在 Sun Java 团队的时候发生的故事。之后的事情就是众所周知的历史了:Java 团队的掌上明珠 EJB 被悉尼大学的 Rod Johnson 这个音乐学博士单枪匹马挑下马,最后完败于 Spring。
因此,本课程采用快速迭代的开发模式,从一个最简单的程序开始,一步步堆积演化,每写一小段代码,都是一个可运行的程度。在不断迭代中完善框架功能,最终实现 Spring 框架的核心:IOC、MVC、JDBC Template 和 AOP。在一步步的迭代过程中,将 Spring 的底层原理融入代码中,一层层对照 Spring 框架的现有结构,让原理理解起来不再困难。
我们自己动手,尽量少用现成的包,以刀耕火种的方式写程序,这可以让我们彻底地理解底层原理。希望你能够从一开始就跟我一起动手,毕竟编程说到底是一个手艺活,就是动手去写,要坚持不断地练习,就能大有成效。
我自己也是经历了这么一个过程:开始只是使用框架平台,很快到了一个瓶颈;之后就开始阅读源码,了解原理解决困惑,但是仍然处于似懂非懂的状态;后来就尝试自己动手写 Spring,遇到问题想破脑袋后翻查 Spring 的源代码,在一遍一遍地挫折借鉴中打通关节,终于有一天豁然开朗。
我们学习 MiniSpring 的目标是掌握 Spring 框架,所以我们不会自己独创什么概念和结构,而是老老实实按照 Spring 的结构模仿着手写。因此我们的目录结构、包名、类名接口名、继承体系、类中的主要方法名都是原封不动照搬 Spring 框架的。这是为了今后你一头扎进 Spring 框架的源代码中的时候不至于迷失方向,能很快地畅游于 Spring 的大海中。

课程设计

我们 MiniSpring 的课程大体上分成四大部分:IoC 容器、MVC、JDBC Tempalte 和 AOP。
熟悉 Spring 框架的人也知道,这四大部分就是 Spring 框架的核心了。学好这些,今后你扩展到更多方面也会很容易。
第一部分:IoC 容器
IoC 容器是 Spring 核心中的核心,Spring 抽象出 Bean 这个概念,用一个容器管理所有的 Bean,并解决上层应用的业务对象之间的耦合问题。后面所有的特性都依赖于 Bean 的概念和这个容器。因此即使我们简单地说 Spring 框架就是一个 IoC 容器也未尝不可。
这个部分我们会从一个极简容器开始,逐步扩展增强,最终实现一个完整的 IoC 容器,包含 Spring 框架对应的核心功能,实现 Bean 的管理。基于这个核心,逐步扩展到 MiniSpring 的其他特性。打好这个基础,后面的学习会事半功倍。
第二部分:MVC
MVC 是 Spring 支持 Web 模式的程序结构,它是基于 Servlet 技术实现的。基本思路是利用 Servlet 机制,用一个单一的 Servlet 拦截所有请求,然后根据请求里面的的信息把任务分派给不同的业务类处理,实现原始的 MVC 结构。
在这一部分,我们还会将 MVC 与第一部分的 IoC 容器结合起来,构成一个更大、更完整的框架。在一步步的构造过程中,我们会重点讲解大师们怎么逐步拆解这个 Servlet 的功能,把专业的事情交给专门的部件去做,最后构建成一个完整的体系。
第三部分:JDBC Template
JDBC Tempalte 是 Spring 对数据访问的一个实现,我们会重点分析 Spring 的实现方法,体现 Rodd Johnson 对简洁实用原则的把握。这一部分,我们会学习如何提取出一个 JDBC 访问的模板,来固化访问数据库的流程,怎么自动绑定参数值,简化上层应用程序。在此基础之上,我们还将了解到如何通过数据库连接池提高访问性能,以及模仿 MyBatis 将 SQL 语句配置到外部文件中。
通过这部分的学习,我们可以了解到,整个 JDBC Template 的实现都是运用了前面 IoC 管理 Bean 的方式,将数据的访问抽象成一个个 Bean,注入到系统中。由此,更能深刻体会到 IoC 容器的功用。
第四部分:AOP
AOP 是 Spring 框架中实践面向切面编程的探索。面向对象和面向切面,两者一纵一横,编织成完整的程序结构。在这一部分,我们将了解到 Spring AOP 所采用的一个实现方式:JDK 动态代理。我们会学习动态代理的原理,以及如何用这个技术动态插入业务逻辑,实现切面的特性。
最后我们将再一次看到 AOP 与 IoC 的结合,使用 BeanPostProcessor 自动生成动态代理。这时你就会体会到,我前面说的“IoC 是 Spring 框架核心中的核心”。
在这一步一步的演化过程中,我们对 Spring 的模仿逐渐成型。我坚持一个原则,就是每一步都是可以运行的,都会有看得见的收获,你不需要辛辛苦苦等到最后才能看到成果。当然,自己动手模仿 Spring,是一个难度较大的工作,风景虽好,但过程也是充满艰辛的,最后的果实属于不断探索的人。任何一个技术领域都是这样,不断练习,反复琢磨,最后才能站在山顶。
《诗经》有云:“有匪君子,如切如磋,如琢如磨”。虽然中途会遇到困难,但我希望你可以坚持学习,站到山顶,跟我一起领略 Spring 的风采!
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

郭屹分享了他在软件开发行业30年的经验,以及他开发开源软件MiniSpring的过程。他强调了深入理解Spring框架底层原理的重要性,并提出了通过手写MiniSpring来实现这一目标的方法。文章内容涵盖了IoC容器、MVC、JDBC Template和AOP等核心部分,为读者提供了系统学习Spring框架的指导。通过作者丰富的经验和深入的阐述,读者可以获得高效的学习途径,对于想要深入了解Spring框架底层原理的读者具有一定的参考价值。

2023-03-1389人觉得很赞给文章提建议

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 MiniSpring》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 每天晒白牙
    求老师的开源项目链接,配合专栏学习下

    作者回复: https://www.github.com/YaleGuo/minis

    2023-03-13归属地:北京
    26
  • 风轻扬
    希望学完这门课,能对Spring框架有一个更高层次的认识。老师,miniTomcat、miniRedis有计划开课吗?也很感兴趣。尤其是miniTomcat

    作者回复: 在跟平台商量。

    2023-03-14归属地:北京
    8
    12
  • escray
    看到极客时间又开了一个“手把手”专栏,希望这个专栏能够帮助我真正了解 Spring 框架,更主要的是希望自己能够跟的上专栏更新的节奏。 Spring 框架的四大支柱:IoC 容器,MVC,JDBC Template,AOP,如果按照开篇词中的说法,学完这个专栏,应该会对 Spring 有更深入的了解。 专栏的内容如果能和之前的徐昊老师 TDD 课程结合,就更厉害了。惭愧的是,那个专栏我没能跟下来。

    作者回复: 应该会对你有益处,我这几年带了几波大学生研究生了,绝大部分跟下来的都觉得很有收获。

    2023-03-14归属地:北京
    9
  • timeout
    啥时候再开一门mini redis

    编辑回复: 刚刚应了大伙的要求,出来MiniTomcat,不妨先看下~

    2023-12-14归属地:上海
    1
  • 阿亮
    老师,您好。您的github没有mini redis项目,不知哪里可以看到?

    作者回复: 还未公开。只在线下小班讲过。

    2023-05-08归属地:海南
    2
  • Geek_bd552d
    二刷

    编辑回复: 加油❤️

    2023-04-24归属地:广东
  • limyel
    没想到是《Java 编程十五讲》的作者???我之前在 csdn 买过那门课,受益匪浅,可惜了那么好的资源给了一个不靠谱的平台,异步发在csdn上的内容还缺了一两章,还是我去找异步反馈补上的

    作者回复: 也不能说他们不靠谱,人民邮电出版社是国营企业,比较官僚,行动迟缓。纸质版到现在也没出来。 感谢你一直follow我。

    2023-04-02归属地:福建
  • Geek_e298ce
    老师的那张导图,受益匪浅

    作者回复: 感谢。

    2023-03-30归属地:北京
  • XXG
    春天就适合学习Spring。

    作者回复: ^_^

    2023-03-20归属地:山东
  • peter
    请教老师几个问题: Q1:《Java 编程十五讲》京东上找不到。 这本书是哪一年出版的?为什么京东上搜不到。 Q2:开源项目链接? 文中提到的“MiniSpring,MiniTomcat,MiniRedis,MiniLanguage 等几款开源软件”,有链接吗? Q3:SpringBoot是对Spring的封装吗?

    作者回复: Q1,这本书我是交给人民邮电出版社的。他们有点慢,目前只有电子版,正在商量纸版,网上现在应该有异步图书连载。 Q2,目前不是所有的都有链接,你参看https://github.com/YaleGuo/Minis Q3,SpringBoot是一个集成者,包括了Spring Framework还有相关组件,以及默认配置。

    2023-03-13归属地:北京
收起评论
大纲
固定大纲
为什么建议你学习 Spring 底层原理?
如何高效地掌握 Spring 原理?
课程设计
显示
设置
留言
21
收藏
44
沉浸
阅读
分享
手机端
快捷键
回顶部