手撸spring-IOC容器02

80 阅读2分钟

实现bean的定义、获取、注册

在01章节中,我们没有考虑到单例对象的获取,并且bean的定义直接传入了一个Object对象。 我们确定这一章节的优化目标:

  1. 添加单例功能,在获取bean对象之前判断是否已经在容器中缓存起来了
  2. 定义和注册仍然是老样子,但是我们要清楚BeanFactory的函数逻辑应该是简单的,就是定义类信息,注册类信息
  3. 采用模板模式,即类似接口与具体实现类的关系,我们在模板类中定义好函数,整合多个接口或者类,让实现类(继承者)无需关心调用逻辑,只需关心具体方法的逻辑实现

BeanFactory

作为工厂模式的顶层抽象接口,只需要有一个getBean()方法即可。 为什么不需要有注册bean的方法或者往容器注入bean的方法,答:这些都需要作为成员变量的容器去承载,接口没有,所以就只有一个getBean()方法

该接口有什么作用?为什么还需要一个abstrast类去实现它?因为这个接口相当于抽象出了一个BeanFactory功能,除此之外我们还需要抽象出一个单例Bean注册功能,最后的完全体Factory需要他们两的功能,于是出现了一个集合的抽象模板类AbstractBeanFactory

SingletonBeanRegistry

单例注册接口 只有一个getSingleton(String beanName),没有注册接口,原因同BeanFactory

DefaultSingletonBeanRegistry

该函数实现SingletonBeanRegistry,拥有单例bean的完整注册和获取函数实现

AbstractBeanFactory

模板类,收口BeanFactory接口和DefaultSingletonBeanRegistry类

在上述两个类和接口的功能基础上,还增加了注册Bean和创建Bean的功能函数,此处createBean和getBeanDefinition不予以实现是因为该模板类不负责实现,各个抽象类都只实现自己应该负责的函数

AbstratAutoCapableBeanFactory

负责实现createBean()函数

DefaultListableBeanFactory