手撸spring-IOC容器 01

110 阅读1分钟

第一节:创建简单的IOC容器

什么是bean容器

spring负责管理bean的配置和生命周期,所以可以理解为是承载bean的容器。我们可以设置bean的创建方式(单例还是多例),以及搭建他们之间的依赖(DI)。

为了让spring容器统一管理bean,我们需要做到将bean以统一的格式进行“拆分”,存放到bean的“定义”中去(beanDefiniton),例如类的class对象,将这些详细的“定义”交给spring保存就足够从0创建和配置bean。

简单的bean容器的设计

采用hashMap,能够做到高效的键值对存取。 关于hashMap的优点(集合了数组的索引式查找和链表的便于增删)可以看另外一篇文章: hashMap原理

在bean容器的讨论中我们分析出,需要一个BeanDefinition类保存bean的“定义”,然后BeanFactory用于保存和获取bean、以及注册bean。

一开始,我们设计的beanDefinition直接保存一个bean对象

public class BeanDefinition{

    private Object bean;//保存的信息直接就是一个对象

    public BeanDefinition(Object bean) {
        this.bean = bean;
    }

    public Object getBean(){
        return bean;
    }
} 

bean工厂则是提供了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){
        beanDefinition.put(name, beanDefinition);
    }
}

由此一个最简单的简单的bean容器就创建好了

具体的测试代码可以看书籍

  • 实例化beanFactory
  • 注册某个bean
  • 获取bean

总结

重点是理解需要一个 beanDefinition, 即bean工厂最需要保存的是定义信息,其次才是bean对象本身,因为可以根据定义信息动态创建对象