内容简介
                                                        本书是Java Web编程之Spring系列,主要介绍Spring生态下的框架编写技巧,以及自编类Spring的大型框架及相关生态的思路和具体实现。本书共分两篇,第1~4章为第1篇,介绍Spring底层的运行原理和动态代理机制;第5~8章为第2篇,是综合实战,展示了在Spring生态下不同类型框架的详细编写方法,以及自编类Spring框架及其“全家桶”的完整实现过程。第1篇的内容是为第2篇服务的,第2篇实战时用到的很多知识和思想均源自第1篇。 
本书是一本专注于面向抽象编程的进阶指南,读者对象为依托Spring生态的通用框架编写者,以及基于Spring编码的各层次业务程序员。
                                                    
目录
                                                        第1篇 Spring的重要特性解析 
第1章 准备活动/ 
1.1 相关说明和约定/ 
1.2 新建Spring Boot项目/ 
1.2.1 初始化页/ 
1.2.2 配置微调/ 
1.2.3 自由编码/ 
1.3 本章小结/ 
第2章 Spring运行时的核心组成——Bean/ 
2.1 控制反转(IoC)和依赖注入(DI)简介/ 
2.1.1 IoC和DI的思想/ 
2.1.2 Spring中的IoC容器/ 
2.2 Bean的获取/ 
2.2.1 常规依赖注入/ 
2.2.2 依赖查找/ 
2.3 Bean的创建和初始化/ 
2.3.1 模式注解和注解扫描/ 
2.3.2 配置/ 
2.3.3 BeanDefinition/ 
2.3.4 调用接口创建Bean/ 
2.3.5 @Import注解/ 
2.3.6 SPI机制/ 
2.3.7 FactoryBean/ 
2.3.8 与初始化相关的注解和接口/ 
2.4 Bean的诞生过程/ 
2.4.1 BeanFactory与DI、DL的关系/ 
2.4.2 DL的底层逻辑/ 
2.4.3 原始Bean的诞生/ 
2.4.4 DI的底层逻辑和批量注入时的排序机制/ 
2.4.5 Bean的初始化逻辑/ 
2.4.6 SmartInitializingSingleton的运行时机/ 
2.5 Bean相关的其他重要内容/ 
2.5.1 Spring Boot的主启动流程/ 
2.5.2 SPI机制实现原理简介/ 
2.5.3 由Source载入BeanDefinition的过程/ 
2.5.4 解析配置的过程/ 
2.6 本章小结/ 
第3章 属性值/ 
3.1 常用的值获取/ 
3.2 使用第三方工具注入值/ 
3.2.1 静态变量与实例变量的统一注入/ 
3.2.2 注入至final或static final变量/ 
3.3 @Value注入的底层逻辑简析/ 
3.3.1 值查找的底层逻辑/ 
3.3.2 值注入的底层逻辑/ 
3.4 本章小结/ 
第4章 动态代理/ 
4.1 代理的相关介绍/ 
4.1.1 静态代理/ 
4.1.2 使用动态代理/ 
4.1.3 动态代理实现原理简介/ 
4.2 注解的底层实现/ 
4.2.1 编译时处理Retention/ 
4.2.2 注解的“真实身份”和属性的类型约束/ 
4.3 本章小结/ 
第2篇 综 合 实 战 
第5章 框架编写的一些原则/ 
5.1 面向技术的原则/ 
5.1.1 编程对象的转换/ 
5.1.2 JDK的版本选择/ 
5.1.3 第三方组件的取舍/ 
5.1.4 pom文件的依赖配置/ 
5.1.5 框架中可以使用的工具类/ 
5.2 面向用户的原则/ 
5.2.1 提供给用户的扩展点/ 
5.2.2 提供默认实现/ 
5.2.3 降级方案/ 
5.2.4 扩展点的取舍/ 
5.3 软件设计之SOLID原则/ 
5.3.1 单一职责原则(Single Responsibility Principle)/ 
5.3.2 开闭原则(Open Closed Principle)/ 
5.3.3 里氏替换原则(Liskov Substitution Principle)/ 
5.3.4 接口隔离原则(Interface Segregation Principle)/ 
5.3.5 依赖倒置原则(Dependence Inversion Principle)/ 
5.4 本章小结/ 
第6章 统一的Controller——UniController/ 
6.1 问题起源/ 
6.2 解析问题并选定方案/ 
6.3 框架设计/ 
6.3.1 UniController支持的功能和方法形参设计/ 
6.3.2 DAO接口的标记/ 
6.4 具体编码实现/ 
6.4.1 工程结构/ 
6.4.2 JDK约定和依赖选择/ 
6.4.3 UniController的编码实现/ 
6.4.4 UniService的技术设计/ 
6.4.5 UniService的技术细节/ 
6.5 测试/ 
6.5.1 测试JPA/ 
6.5.2 测试MyBatis/ 
6.6 本章小结/ 
第7章 仿JPA:通过接口方法名执行逻辑——Calculator/ 
7.1 需求场景和准备/ 
7.1.1 方法名约定和自定义运算/ 
7.1.2 定义身份注解和接口/ 
7.1.3 定义@Enable×××注解/ 
7.2 具体编写实现/ 
7.2.1 解析方法名和计算表达式/ 
7.2.2 编写动态代理之InvocationHandler实现类/ 
7.2.3 计算拦截器CalculateInterceptor/ 
7.2.4 启动时扫描用的ImportBeanDefinitionRegistrar/ 
7.3 测试Calculator框架/ 
7.3.1 测试模块的pom文件/ 
7.3.2 编写Calculator用户组件/ 
7.3.3 编写拦截器CalculateInterceptor/ 
7.3.4 编写测试代码/ 
7.4 推广/ 
7.5 本章小结/ 
第8章 自编类Spring框架及生态——Universe/ 
8.1 框架命名/ 
8.2 Universe核心模块/ 
8.2.1 核心注解/ 
8.2.2 核心接口/ 
8.2.3 大纲及基础工具/ 
8.2.4 编码实现——基本说明和StarDefinition/ 
8.2.5 编码实现——StarDefinitionHolder接口/ 
8.2.6 编码实现——StarDataHolder接口/ 
8.2.7 Universe的配套接口/ 
8.2.8 Universe接口及其前置逻辑/ 
8.2.9 Universe接口之getStar/ 
8.2.10 Universe其他方法/ 
8.2.11 
                                                    
前言/序言
                                                        在Java Web编程领域,Spring占据了大半江山,甚至从某种程度上讲,“Java Web编程”几乎等同于“Spring编程”。经过多年发展与演进,Spring拥有十分完善的生态和庞大的用户群体,展现出强大的生命力。 
Spring的核心是IoC容器,以此为基础诞生了所谓的“全家桶”,业务程序员的大部分编码需求,这些“桶”都能满足,极大地提高了生产效率。但万事无绝对,Spring的“桶”再多,也不可能完全满足世界上成千上万业务程序员的每一个需求,它总有鞭长莫及的时候,这就产生了一个新的编程“行当”——为Spring生态打造适合自己的“桶”,也就是自编Spring生态下的框架。 
编写框架和编写一般的业务代码有很大不同,它是纯粹的面向抽象编程,而不是面向具体业务数据的CRUD。框架需要适配很多场景,因此需要很多考量,不仅要考虑纯技术方面,也要考虑业务程序员的用户体验。一个高度抽象、易于扩展和维护,并且能让业务程序员用起来得心应手的框架必然会受到广泛欢迎,它可以让业务程序员更加专注于业务编码本身,并且有可能大幅减少他们的编码工作量。 
框架虽好,但编写它需要较多的知识储备。这些知识涵盖多个方面,有些来自通用的计算机和软件工程理论,还有些来自Java语言以及Spring生态。也就是说,编写框架比编写一般的业务逻辑更加困难,更加考验一个程序员的综合素养。 
编写Spring生态下的框架,首先需要了解Spring、研究Spring,然后才能做到“融入Spring”,本书正是为此而生。本书不是Spring的入门教程,阅读本书至少要求读者能编写基本的Spring Boot程序。本书的目标在于研究Spring的底层机制,并结合其他的编程知识,最终使读者能灵活自如地为Spring生态添加应用型框架,甚至编写属于自己的Spring(即“类Spring框架”)。退一步讲,哪怕读者不是框架编写者而是业务程序员,阅读本书后,相信也可以获得很多编程技巧。 
放眼当下,我们已进入AI时代,程序员的编码要求也在提高,因为简单的CRUD代码都可以让AI来完成,仅停留在“会用语法”层次的程序员将会非常被动,行业对程序员的抽象思维能力和架构设计能力提出了新的要求。程序员必须持续学习,对自己使用的工具和框架进行深入的研究,甚至具备自行编写新工具和框架的能力。 
本书附赠所有源码。第1篇是一个整体,因此第1篇所有内容将共享工程(基于JDK 21及Spring Boot 3的project-one和基于JDK 8及Spring Boot 2的project-two)。读者查阅这两个工程的源码时如果发现某些代码被“//”或“/**/”注释,按需取消注释即可。第2篇是综合实战,除第5章外,每一章的源码都在独立的工程中,打开源码目录即可找到。 
本书在编写过程中得到了机械工业出版社张淑谦老师的大力支持,在此致以衷心的感谢! 
尽管作者在编写时力求准确,但由于自身水平有限,书中错误和疏漏之处在所难免,恳请读者予以指正。
                                                    
                      

                   


















