
本书基于Spring框架的核心逻辑,通过实现简化版Spring框架的方式,对Spring进行分析、设计和实践。本书以实践为核心,摒弃Spring源码中繁杂的内容,选择框架中的核心逻辑,简化代码实现过程,保留核心功能,如IOC、AOP、Bean的生命周期、上下文、作用域、资源处理、JDBC、事务、开发简易版ORM框架、将ORM框架整合到Spring框架中等内容的方案设计和源码实现。在Spring框架功能模块的开发过程中,逐步介绍并深入分析其中所涉及的设计原则和设计模式,使读者游刃有余地解决在调试Spring源码及开发SpringBoot Starter组件时遇到的问题。本书既可以作为计算机相关行业研发人员的辅导书,也可以作为高等院校计算机专业学生的参考书。无论是初学者,还是中、高级研发人员,都能从本书中获得启发。
前言 Spring是一个优秀的轻量级Java开发框架。2003年6月,Rod Johnson创建了Spring框架,第一次发布在Apache 2.0许可证下,后将其改名为Spring并且正式发布。 2002年10月,Rod Johnson在Expert One-on-One J2EE Design and Development一书中,对Java EE系统的框架臃肿、低效、脱离现实等问题提出了质疑,并提出了一个基于普通Java类和依赖注入的简单解决方案。然后,Rod Johnson创建了Interface 21框架。它是一个从实际需求出发,着重于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。Spring框架以Interface 21框架为基础,经过重新设计和内容的不断丰富,里程碑式的Spring 1.0版本于2004年3月正式发布。同年,Rod Johnson又推出了一部堪称经典的图书Expert one-on-one J2EE Development without EJB,该书在Java开发领域掀起了轩然大波,不断改变着Java开发者对程序设计和开发的思考方式。 对于希望长期从事编程开发的架构师和技术研发人员,不仅要熟练使用Spring框架,还要掌握其源码设计,通过学习这些优秀的设计思想和设计模式在实际场景中的应用方法,提高自己的业务工程架构设计能力,以及对基于Spring框架所实现的一些技术类组件的驾驭与把控能力。 为什么撰写本书 大部分使用Spring框架的研发人员在遇到Spring框架的报错提醒,以及需要基于Spring框架开发SpringBoot Starter等技术类组件时,会尝试阅读Spring框架的源码。由于Spring框架的源码体量庞大、语法复杂,也不像平常的业务流程开发代码一样具有分层结构,并且其中使用了大量的设计模式,所以阅读难度较大。研发人员很难厘清其中的调用链路和各个类之间的关系。 笔者阅读了不少关于Spring 的图书,在反复学习源码后,仍然难以理解Spring 框架 中各个功能的实现细节。其中一个原因是自己没有动手实践,只阅读了图书,很难完全 掌握Spring 框架的精髓。因此,笔者结合《Spring 源码深度解析》《精通Spring 4.x——企业应用开发实战》等图书,以及GitHub 中的优秀案例——code4craft/tiny-spring、DerekYRC/mini-spring 等,逐步完成了Spring 框架中核心源码的实现,并扩展了ORM框架。 在编写的过程中,还收到了GitHub 用户zh-d-d、cwjokaka、numgin 提交的PR,在此表示感谢。在学习过程中,笔者对Spring 框架有了非常深入的了解和认识,也体会了更多精妙的设计原则和设计模式。所以,我把关于手动实现简单版Spring 框架的内容编写成书,希望可以帮助更多的研发人员学习Spring 源码,编写出有价值的设计方案。 本书主要内容 本书采用从零手写Spring 的方式,摒弃Spring 源码中繁杂的内容,选择整体框架中的核心逻辑,简化代码实现过程,保留核心功能,如IOC、AOP、Bean 的生命周期、上下文、作用域和资源处理等。在开发过程中,细化功能模块,逐步完成一个简单版的Spring 框架。 本书共21 章。引言介绍了学习Spring 的方法,以及本书源码的获取和使用方式。 ? 第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 框架的内容,掌握学习方法。同时,“引言”中也列举了本书工程源码的环境配置、获取和使用方法。 致谢 要特别感谢我的父母(付井海、徐文杰)、妻子(郭维清),由于他们在日常生活中分担了许多家庭任务,才让我有更多的时间投入文字创作中,使得这本书能与广大读者见面。 感谢灵魂设计师Beebee老师为本书设计封面插图。 博文视点的宋亚东编辑的热情推动最终促成了我与电子工业出版社的合作。感谢电子工业出版社博文视点对本书的重视,以及为本书出版所做的一切。 由于笔者水平有限,书中难免存在一些疏漏和不足,希望广大同行专家和读者给予批评与指正。 付政委(小傅哥)
目录 引言 /1 第1章 实现一个简单的Spring Bean容器 / 7 1.1 容器是什么 / 7 1.2 简单容器设计 / 8 1.3 简单容器实现 / 9 1.4 容器使用测试 / 12 1.5 本章总结 / 13 第2章 实现Bean对象的定义、注册和获取 / 14 2.1 容器的思考 / 14 2.2 完善容器设计 / 15 2.3 完善容器实现 / 16 2.4 Bean 生命周期测试 / 22 2.5 本章总结 / 24 第3章 基于Cglib实现含构造函数的类实例化策略 / 25 3.1 实例化问题 / 25 3.2 实例化策略设计 / 26 3.3 实例化策略代码实现 / 27 3.4 构造函数对象测试 / 32 3.5 本章总结 / 35 第4章 注入属性和依赖对象 / 36 4.1 Bean对象拆解思考 / 36 4.2 属性填充设计 / 37 4.3 属性填充实现 / 38 4.4 注入属性测试 / 43 4.5 本章总结 / 46 第5章 资源加载器解析文件注册对象 / 47 5.1 对象创建问题 / 47 5.2 资源加载和解析设计 / 48 5.3 资源加载和解析设计实现 / 49 5.4 配置Bean对象注册测试 / 60 5.5 本章总结 / 64 第6 章 实现应用上下文 / 65 6.1 分治Bean 对象功能 / 65 6.2 Bean 对象扩展和上下文设计 / 66 6.3 Bean 对象扩展和上下文实现 / 68 6.4 应用上下文功能测试 / 79 6.5 本章总结 / 83 第7 章 Bean 对象的初始化和销毁/ 84 7.1 容器管理Bean 功能 / 84 7.2 初始化和销毁设计 / 85 7.3 初始化和销毁实现 / 87 7.4 容器功能测试 / 97 7.5 本章总结 / 99 第8 章 感知容器对象 / 101 8.1 Spring Bean 容器的功能 / 101 8.2 感知容器设计 / 102 8.3 感知容器实现 / 103 8.4 Aware 接口的功能测试 / 111 8.5 本章总结 / 114 第9 章 对象作用域和FactoryBean/ 117 9.1 Bean 对象的来源和模式 / 117 9.2 FactoryBean 和对象模式设计 / 118 9.3 FactoryBean 和对象模式实现 / 119 9.4 代理Bean 和对象模式测试 / 128 9.5 本章总结 / 132 第10 章 容器事件和事件监听器 / 134 10.1 运用事件机制降低耦合度 / 134 10.2 事件观察者设计 / 135 10.3 事件观察者实现 / 136 10.4 事件使用测试 / 146 10.5 本章总结 / 148 第11 章 基于JDK、Cglib 实现AOP 切面 / 150 11.1 动态代理 / 150 11.2 AOP 切面设计 / 151 11.3 AOP 切面实现 / 152 11.4 AOP 切面测试 / 163 11.5 本章总结 / 165 第12 章 把AOP 融入Bean 的生命周期 / 166 12.1 AOP 与框架整合思考 / 166 12.2 AOP 切面设计 / 167 12.3 AOP 切面实现 / 168 12.4 切面使用测试 / 176 12.5 本章总结 / 179 第13 章 自动扫描注册Bean对象 / 180 13.1 注入对象完善点 / 180 13.2 自动扫描注册设计 / 181 13.3 自动扫描注册实现 / 182 13.4 注册Bean 对象测试 / 190 13.5 本章总结 / 193 第14 章 通过注解注入属性信息 / 194 14.1 引入注入注解 / 194 14.2 注入属性信息设计 / 195 14.3 注入属性信息实现 / 196 14.4 注解使用测试 / 206 14.5 本章总结 / 208 第15 章 给代理对象设置属性注入 / 210 15.1 代理对象创建过程问题 / 210 15.2 代理对象属性填充设计 / 211 15.3 代理对象属性填充实现 / 212 15.4 代理对象属性注入测试 / 219 15.5 本章总结 / 221 第16 章 通过三级缓存解决循环依赖 / 222 16.1 复杂对象的创建思考 / 222 16.2 循环依赖设计 / 223 16.3 循环依赖实现 / 227 16.4 循环依赖测试 / 234 16.5 本章总结 / 238 第17 章 数据类型转换 / 239 17.1 类型转换设计 / 239 17.2 类型转换实现 / 240 17.3 类型转换测试 / 249 17.4 本章总结 / 251 第18 章 JDBC 功能整合 / 252 18.1 JdbcTemplate 说明 / 252 18.2 整合JDBC 服务设计 / 253 18.2 整合 JDBC 服务开发 / 254 18.3 JDBC 功能测试 / 258 18.4 本章总结 / 260 第19 章 事务处理 / 261 19.1 了解事务 / 261 19.2 事务功能设计 / 262 19.3 事务功能实现 / 264 19.4 切面事务测试 / 272 19.5 本章总结 / 276 第20 章 ORM 框架实现 / 278 20.1 简单ORM 框架设计 / 278 20.2 简单ORM 框架实现 / 279 20.3 ORM 框架使用测试 / 287 20.4 本章总结 / 290 第21 章 将ORM 框架整合到Spring Bean容器中 / 291 21.1 ORM-Spring 整合设计 / 291 21.2 ORM-Spring 整合实现 / 292 21.3 整合功能验证 / 299 21.4 本章总结 / 302