一、前言
在软件开发中,系统的健壮性和抗压能力是衡量程序优劣的重要指标。无论是高并发场景下的超卖问题,还是复杂业务逻辑中的幂等性,开发人员都需要具备处理这些问题的能力。而这些问题往往不是通过简单的CRUD操作就能解决的,它需要深厚的技术积累和良好的架构设计。对于初级程序员来说,可能会遇到代码丢三落四、乱码等问题,这不仅影响系统的稳定性,还可能带来隐患。在这种情况下,要想让你的程序“抗揍”,就必须提升自己的技术水平,理解并应用更高级的设计理念和模式。
在之前的章节中,我们实现了一个简化版的Spring Bean容器,支持Bean的注册和实例化。尽管我们已经支持了构造函数的Bean实例化,但还没有处理Bean的属性注入和依赖注入功能。这些功能对于一个完整的IoC容器来说是必不可少的。因此,本章节的目标是为Bean对象注入属性和依赖Bean的功能实现奠定基础。
二、目标
通过本章节的学习,你将学会:
- 为Bean对象注入属性。
- 实现Bean之间的依赖注入。
- 完成Bean对象的完整实例化过程,包括属性填充。
三、设计
在设计过程中,我们需要解决以下几个关键问题:
-
属性注入的时机:属性注入应该在Bean实例化之后进行。因此,我们需要在
AbstractAutowireCapableBeanFactory
的createBean
方法中添加一个补全属性的方法,即applyPropertyValues
。 -
属性值的表示:为了支持属性注入,我们需要在
BeanDefinition
中添加PropertyValues
。PropertyValues
是一个集合类,用于存储多个PropertyValue
。PropertyValue
代表一个具体的属性,包含属性名和属性值。 -
依赖注入的处理:在属性注入的过程中,如果属性值是一个未实例化的Bean对象,需要递归地进行实例化和注入。这涉及到通过
BeanReference
来引用其他Bean,从而实现依赖注入。
1. UML类图
以下是实现这一功能的核心类和接口的结构图:
└── src
├── main
│ └── java
│ └── cn.mxy.springframework.beans
│ ├── factory
│ │ ├── config
│ │ │ ├── BeanDefinition.java // Bean定义类,增加PropertyValues属性
│ │ │ ├── BeanReference.java // 用于表示Bean的引用
│ │ │ └── SingletonBeanRegistry.java// 单例Bean注册表接口
│ │ ├── support
│ │ │ ├── AbstractAutowireCapableBeanFactory.java // 实现属性注入逻辑
│ │ │ ├── AbstractBeanFactory.java // BeanFactory抽象类
│ │ │ ├── BeanDefinitionRegistry.java// Bean定义注册表
│ │ │ ├── DefaultListableBeanFactory.java // 默认BeanFactory实现
│