文章目录
- 0 引言
- 1 开始实现一个简单的Spring Bean容器
- 2 基于模板模式实现对象定义、注册和获取
- 3 基于策略模式实现含构造函数的类实例化
- 4 注入属性和依赖对象
- 5 将资源文件中定义的对象注册到容器中
- 6 实现ApplicationContext
- 7 Bean对象的初始化和销毁
- 8 感知容器对象
- 9 对象Scope和FactoryBean
- 10 基于观察者模式的容器事件发布
- 11 基于JDK、Cglib实现对象动态代理
- 12 将AOP融入Bean声明周期
- 13 自动扫描注册Bean对象
- 14&15 通过注解注入属性信息
- 16 通过三级缓存解决循环依赖
- 17 类型转换
- 18 JDBC功能整合
- 19 事务处理
- 20 简单ORM框架实现
- 21 将ORM框架整合到Spring容器中
- 22 常见笔面试题
0 引言
这个是《手写Spring渐进式源码实践》书籍的读书笔记。
0.1 Spring框架地图
1 开始实现一个简单的Spring Bean容器
1.1 设计思路
使用Map数据结构来存储所有的Bean对象。
2 基于模板模式实现对象定义、注册和获取
2.1 设计思路
使用模板模式,统一使用核心方法的调用逻辑和标准定义,进而可以很好地实现后续步骤而不用关心某一方法的调用逻辑。按照统一方式执行,类的继承者只需要关心具体方法如何实现即可。
2.2 类图
2.3 实现
https://github.com/kaikai-sk/book-small-spring.git/
2.4 疑问和反思
- 模板模式的使用
以前的使用方法. 就是单纯的继承实现。
BaseClass {
pubic void mianProcess() {
process1();
process2();
process3();
}
}
Class A extends BaseClass {
pubic process2() {
}
}
Class B extends BaseClass {
pubic process2() {
}
}
- 为什么是先AbstractAutowireCapableBeanFactory提供createBean的能力
正常理解应该是按照业务流程的顺序,子类1先去实现获取beanDeinition的功能,然后子类2去实现createBean的能力。这样就跟主流程符合。 - BeanDefinition getBeanDefinition(String name);为什么没有直接定义到接口里面去呢?感觉也是可以的。
3 基于策略模式实现含构造函数的类实例化
3.1 设计思路
不能简单的直接使用newInstance来进行类型实例化。要处理带参数的构造函数的情况。 创建类实例有多种技术手段,例如JDK本身的能力和cglib。可以通过策略模式来进行组织。
3.2 类图
4 注入属性和依赖对象
4.1 设计思路
表示引用类型的属性。
public class BeanReference {
private final String beanName;
public BeanReference(String beanName) {
this.beanName = beanName;
}
public String getBeanName() {
return beanName;
}
}
基本类型的属性。
public class PropertyValue {
/** 属性名称 */
private final String name;
/** 属性值 */
private final Object value;
对象数组的表示
public class PropertyValues {
private final List<PropertyValue> propertyValueList = new ArrayList<>();
}
5 将资源文件中定义的对象注册到容器中
5.1 设计思路
Resource和ResourceLoader实现对资源的加载。BeanDefinitionReader实现的是对资源的解析,将文件中定义的bean注入到容器中。
5.2 类图
6 实现ApplicationContext
6.1 设计思路
将资源管理和Bean管理的功能进行整合,全部整合到ApplicationContext中。通过context的封装,可以提升整个系统的易用性。
6.2 类图
- Bean管理能力的抽象层次
- ApplicationContext的设计思路
7 Bean对象的初始化和销毁
7.1 设计思路
开方接口供用户自定义对象的初始化方法和对象销毁前调用的方法。
7.2 类图
- Bean管理中的对象初始化和销毁
- ApplicationContext中初始化和销毁
8 感知容器对象
8.1 设计思路
让容器使用方能感知到容器的一些关键对象。例如,可以让容器的使用方能够获取到ApplicationContext,或者BeanFactory。
8.2 类图
8.3 小结
9 对象Scope和FactoryBean
9.1 设计思路
FactoryBean是工厂对象。第三方对象生产者提供FactoryBean的实现类,在忽略一些处理细节的基础上包装出一个复杂对象(例如包装一个代理对象)。
通过Spring容器获取到的对象有两种情况:一种是单例的,一种是非单例的。 单例对象会被保存到容器中,初次创建之后不会再创建。多例的,每次都是新创建出来的对象。
9.2 类图
10 基于观察者模式的容器事件发布
10.1 设计思路
以观察者模式的方式,设计和实现Event的容器事件和事件监听器的功能。可以在Spring框架中定义、监听和发布自己的事件信息。
10.2 类图
11 基于JDK、Cglib实现对象动态代理
11.1 设计思路
实现动态代理,为实现AOP功能做准备。
11.2 类图
12 将AOP融入Bean声明周期
12.1 设计思路
将实现aop的相关代码整合到Bean的声明周期中。简化AOP的使用。
12.2 类图
13 自动扫描注册Bean对象
13.1 设计思路
实现@Component的功能。
13.2 类图
14&15 通过注解注入属性信息
14.1 设计思路
实现@Value和@Autowired等功能。
14.2 类图
16 通过三级缓存解决循环依赖
17 类型转换
17.1 设计思路
关键就是怎么对各种类型的转换器进行组织。
17.2 类图
18 JDBC功能整合
18.1 设计思路
封装JDBC模板作为整个数据库操作的入口类。
18.1 类图
19 事务处理
19.1 设计思路
利用AOP的能力,在出现异常的时候就回滚。
19.2 类图
20 简单ORM框架实现
20.1 思路
ORM(Object Relational Mapping):对象关系映射,用于解决面向对象编程语言中不同类型系统的数据之间的转换问题。
20.2 类图
21 将ORM框架整合到Spring容器中
21.1 类图
22 常见笔面试题
22.1 多个AOP的顺序
order注解指定
22.2 BeanFactory和FactoryBean的区别
FactoryBean包装出一个复杂对象。
22.3 解决循环依赖
三层缓存
22.4 事务的传播类型
22.5 Spring事务失效的场景
https://blog.csdn.net/hanjiaqian/article/details/120501741