手写Spring渐进式源码实践

0 引言

这个是《手写Spring渐进式源码实践》书籍的读书笔记。

0.1 Spring框架地图

在这里插入图片描述

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

1.1 设计思路

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

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

2.1 设计思路

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

2.2 类图

Bean容器类的设计

2.3 实现

在这里插入图片描述
https://github.com/kaikai-sk/book-small-spring.git/

2.4 疑问和反思

  1. 模板模式的使用
    以前的使用方法. 就是单纯的继承实现。
BaseClass {
	pubic void mianProcess() {
		process1();
		process2();
		process3();
	}
}

Class A extends BaseClass {
	pubic process2() {
	}
}

Class B extends BaseClass {
	pubic process2() {
	}
}
  1. 为什么是先AbstractAutowireCapableBeanFactory提供createBean的能力
    正常理解应该是按照业务流程的顺序,子类1先去实现获取beanDeinition的功能,然后子类2去实现createBean的能力。这样就跟主流程符合。
  2. 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 类图

  1. Bean管理能力的抽象层次
    在这里插入图片描述
  2. ApplicationContext的设计思路
    在这里插入图片描述

7 Bean对象的初始化和销毁

7.1 设计思路

开方接口供用户自定义对象的初始化方法和对象销毁前调用的方法。

7.2 类图

  1. Bean管理中的对象初始化和销毁
    在这里插入图片描述
  2. 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

猜你喜欢

转载自blog.csdn.net/kaikai_sk/article/details/129470619