1.创建spring容器

😀 1.创建spring容器

本文介绍small_spring的第一节知识,简单的实现一个最基础的spring中的容器,包括定义、存储、获取这个容器中的bean对象,相比于真正的spring源码只是一个简化版本,后面的章节会慢慢的对这个容器进行扩充,文章中涉及到的代码在 仓库

思路

​ 一般的spring容器需要经历两步才能将一个bean存储到IOC容器中,分别是定义、注册,其中定义一般是存放bean的类型,但是在本节中直接存放的是bean对象本身,后期将对这个功能做出修改。注册一般是将bean的名称与其类型的映射关系,但是本节中直接实例化一个bean,然后将这个bean存储到容器中,最后的获取就是按照bean的名称获取对应的bean对象

​ 按照上面的分析,代码的主要逻辑就是将bean的实例化对象存储到一个容器中,之后通过bean的名称获取,实现这中功能的容器一般是Map,整个流程如下:

img

实现

  1. 定义:主要是定义一个BeanDefinition类,然后将bean的实例化对象存储进去,所以这里直接使用Object来存储这个对象
  2. 注册,主要是将BeanDefinition中的bean对象及其名称之间的映射关系保存起来,代码中直接使用HashMap来存储这种映射关系
  3. 获取,直接按照键,也就是bean的名称获取到对应的bean,这里并没有考虑bean不存在的问题,因为本节中只是最简单的手动实例化一个bean,然后将其存储到容器中
  4. 测试:针对定义的IOC容器进行测试:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
@Test
public void testBeanFactory() {
    //1.定义
    //获取工厂对象
    BeanFactory beanFactory = new BeanFactory();
    //准备要注入的bean对象
    UserService userService = new UserService();
    //将其注入到BeanDefinition中
    BeanDefinition beanDefinition = new BeanDefinition(userService);
    //2.注册
    //将bean保存到IOC容器中
    beanFactory.
        registerBeanDefinition("userService", beanDefinition);
    //3.获取
    //根据名称从IOC容器中取出对应的bean
    UserService user = (UserService) beanFactory.getBean("userService");
    //执行bean的对应方法
    user.print();
}

可以看出测试的过程就是上面描述的三步,只不过相比于真正的spting,大大的简化了所有的步骤

总结

本节实现了一个最基础的不标准IOC容器,后面的章节会逐步对这个容器进行扩充