1. 理解知识
Spring 容器的作用
Spring 容器是Spring的核心,用来管理Bean对象的。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。
Bean 对象的管理
当一个 Bean 对象交给 Spring 容器管理时,这个 Bean 对象会被拆解成多个配置项,存储在 Bean 的定义中。
这种拆解操作使得对象更加模块化和解耦,从而更容易被 Spring 容器管理和操作。例如,Spring 容器可以轻松处理循环依赖等问题,确保应用的稳定性和高效性。
2. 设计
模拟 Spring 容器的设计
在模拟 Spring 框架时,首先需要创建一个 Spring 容器,这是 Spring 框架的核心组件。所有 Bean 都存储在容器内,并通过控制反转(IOC)技术进行管理。
Spring 容器本质上是一个 Bean 工厂(BeanFactory
),负责 Bean 的实例化、获取和销毁。ApplicationContext
是 Spring 容器的一个典型实现类,它提供了基本的 Bean 管理功能。
凡是可以存放数据的具体数据结构实现,都可以称之为容器。例如:ArrayList、LinkedList、HashSet等,但在 Spring Bean
容器的场景下,我们需要一种可以用于存放和名称索引式的数据结构,所以选择 HashMap
是最合适不过的。
3. 实现
BeanDefinition
:通常由Spring容器在启动过程中根据配置信息或注解生成,是Sping Ioc容器管理的核心数据结构之一,用于保存Bean的配置和属性。
第一步
创建BeanFactory(Bean工厂)
public class BeanFactory {// 泛型:<String, BeanDefinition> 表示键是 String 类型,值是 BeanDefinition 类型。// ConcurrentHashMap 是线程安全的哈希表实现,用于存储 bean 的定义信息。private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();public Object getBean(String name) {// 通过 name -> 获取 bean// 这里的get方法是 Map接口提供的,返回的是一个BeanDefinition对象return beanDefinitionMap.get(name).getBean();}// 通过 name 和 BeanDefinition 对象注册public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {beanDefinitionMap.put(name, beanDefinition);}
}
这里get方法是ConcurrentHashMap 内自带的方法,通过键返回值
创建BeanDefinition( Bean定义)
public class BeanDefinition {// Bean 对象private Object bean;// 初始化Bean并赋值public BeanDefinition(Object bean) {this.bean = bean;}// 获取Beanpublic Object getBean() {return bean;}
}
第二步
创建UserService测试对象
public class UserService {public void queryUserInfo(){System.out.println("查询用户信息");}}
创建测试用例
public class ApiTest {@Testpublic void test_BeanFactory(){// 1.初始化 BeanFactoryBeanFactory beanFactory = new BeanFactory();// 2.注册 bean// 构造方法传入UserService对象BeanDefinition beanDefinition = new BeanDefinition(new UserService());// 通过BeanDefinition的registerBeanDefinition去注册bean // 注意泛型 String,BeandefinitionbeanFactory.registerBeanDefinition("userService", beanDefinition);// 3.获取 beanUserService userService = (UserService) beanFactory.getBean("userService");userService.queryUserInfo();}
}
第三步
运行测试用例
查询用户信息Process finished with exit code 0
总结流程
一个 Spring 容器的注册,归根结底是通过 BeanDefinition
进行注册的,再通过 BeanFactory
进行管理分配,
一个 BeanFactory 可以管理多个 BeanDefinition