一、Spring Bean 容器是什么
Spring 包含并管理应用对象的配置和生命周期,在这个意义上它是一种用于承载对象的容器,你可以配置你的每个Bean对象是如何被创建的,这些Bean可以创建一个单独的实例或者每次需要时都生成一个新的实例,以及它们是如何相互关联构建和使用的。
如果一个Bean对象交给Spring容器管理,那么这个Bean对象就应该类似零件的方式被拆解后存放到Bean的定义中,这样相当于一种对象解耦的操作,可以由Spring更加容易的管理。
当一个Bean对象被定义存放以后,再由Spring统一进行装配,这个过程包括Bean的初始化、属性填充等,最终我们就可以完整的使用一个Bean实例化后的对象了。
二、设计
凡是可以存放数据的具体数据结构实现,都可以称为容器。但在Spring Bean容器的场景下,我们需要一种可以用于存放和名称索引式的数据结构,所以选择HashMap是最合适不过的。
一个简单的Bean容器实现,还需Bean的定义、注册、获取基本三个步骤:
- 定义:BeanDefinition,这个类在查阅源码中是经常看到的,但目前我们初步实现会非常简单的处理,制定义一个Obejct类型用于存放对象。
- 注册:这个过程相当于我们把数据存放到HashMap中,只不过现在HashMap存放的是定义了Bean的对象信息。
- 获取:Bean的名字就是key,容器初始好Bean以后,就可以直接获取了。
三、实现
1、工程结构
2、Bean定义
public class BeanDefinition {
private Object bean;
public BeanDefinition(Object bean) {
this.bean = bean;
}
public Object getBean() {
return bean;
}
}
- 目前的Bean定义中,只有一个Object用于存放Bean对象。
- 在后面陆续的实现中会逐步完善BeanDefinition相关属性的填充。
3、Bean工厂
public class BeanFactory {
private Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
public Object getBean(String name) {
return beanDefinitionMap.get(name).getBean();
}
public void registerBeanDefinition(String name, BeanDefinition beanDefinition) {
beanDefinitionMap.put(name, beanDefinition);
}
}
- 在Bean工厂的实现中,包括了Bean的注册,这里的注册的是Bean的定义信息。同时在这个类中还包括了获取Bean的操作。
四、测试
1、事先准备
public class UserService {
public void queryUserInfo() {
System.out.println("查询用户信息");
}
}
- 这里简单定义一个UserService对象,方便下面的容器测试。
2、测试用例
public class BeanDefinitionTest {
@Test
public void test() {
//初始化BeanFactory
BeanFactory beanFactory = new BeanFactory();
//注册bean
BeanDefinition beanDefinition = new BeanDefinition(new UserService());
beanFactory.registerBeanDefinition("userService", beanDefinition);
//获取bean
UserService userSerivce = (UserService) beanFactory.getBean("userService");
userSerivce.queryUserInfo();
}
}
- 在单侧中主要包括初始化Bean工厂、注册Bean、获取Bean这三个步骤。
- 在Bean的注册中,这里是直接把UserService实例化后作为入参传递给BeanDefinition的,在后面的实现中,会将这部分内容放入Bean工厂中实现。
3、测试结果
- 通过测试结果可知,目前的Spring Bean容器案例已经稍有雏形。