渐进式实现Spring日志

渐进式实现Spring日志

1 开始实现一个简单的Spring Bean容器

1.1 设计思路

使用Map数据结构来存储所有的Bean对象。

2. 基于模板模式实现对象定义、注册和获取

2.1 设计思路

使用模板模式,统一使用核心方法的调用逻辑和标准定义,进而可以很好地实现后续步骤而不用关心某一方法的调用逻辑。按照统一方式执行,类的继承者只需要关心具体方法如何实现即可。

基于模板方法模式实现对象定义, 注册, 获取

image-20240203153836970

SingletonBeanRegistry
- 获取单例的注入和获取能力

DefaultSingletonBeanRegistry
- 内部维护singletonObjectsMap, 提供单例对象的管理能力

BeanFactory
- 获取Bean的能力

AbstractBeanFactory
- 提供getBean的模板方法实现
- 获取单例, 获取成功直接返回(利用父类DefaultSingletonBeanRegistry)
- 获取BeanDefinition 抽象方法交给子类实现
- 创建Bean实例 抽象方法交给子类实现


DefaultAutowireCapableBeanFactory
- 实现创建Bean的能力

BeanDefinition
- 记录用户对Bean的需求

BeanDefinitionRegistry
- 注册BeanDefinition的能力

DefaultListableBeanFactory
- 类本身只通过维护beanDefinitionMap, 提供BeanDefinition的管理能力
- 但是由于继承, 使其成为完整完成bean管理的容器

3 基于策略模式实现含构造函数的类实例化

3.1 设计思路

不能简单的直接使用newInstance来进行类型实例化。要处理带参数的构造函数的情况。 创建类实例有多种技术手段,例如JDK本身的能力和cglib。可以通过策略模式来进行组织

img

InstantiationStrategy
- 策略模式, 提供创建对象实例的能力

CglibSubClassingInstantiationStrategy
- 通过Cglib实现Bean的实例化能力

SimpleInstantiationStragy
- 通过JDK实现Bean的实例化能力

4 注入属性和依赖对象

image-20240203191909913

PropertyValue
- 封装Bean对象单个属性(基本属性)的属性名和值

PropertyValues
- 封装Bean对象全部属性的属性名(基本属性)和值的集合

BeanReference
- 封装Bean对象的引用属性

BeanDefinition
- 在Bean定义中添加PropertyValues属性

AbstracAutowireCapableBeanFactory
- 在createBean中新增applyPropertyValues方法, 根据BeanDefinition 为实例化后的Bean填充属性

5 将资源文件中定义的对象注册到容器中

5.1 设计思路

Resource和ResourceLoader实现对资源的加载。BeanDefinitionReader实现的是对资源的解析,将文件中定义的bean注入到容器中

在这里插入图片描述


6 实现ApplicationContext
6.1 设计思路
将资源管理和Bean管理的功能进行整合,全部整合到ApplicationContext中。通过context的封装,可以提升整个系统的易用性。

在这里插入图片描述

在这里插入图片描述

ListableBeanFactorybeanFactory接口的扩展接口,它可以枚举所有的bean实例,而不是客户端通过名称一个一个的查询得出所有的实例。要预加载所有的bean定义的beanfactory可以实现这个接口来。该 接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数、获取某一类型Bean的配置名、查看容器中是否包括某一Bean等方法