疯狂的小鸡

IOC相关类梳理

字数统计: 798阅读时长: 2 min
2018/10/01 Share

BeanFactory

首先谈谈BeanFactory。BeanFactory是IoC容器最顶端的接口,它定义了IoC容器的基本形式与规范。例如,接口中设计了getBean()方法。这个方法是IoC容器的API的主要方法,用来取得容器中管理的bean。另外还定义了一些bean类型相关的方法,例如isSingleton(), isPrototype(),getType()等。

BeanFactory接口下面主要有两条设计线路。

DefaultListableBeanFactory

DefaultListableBeanFactory继承树
第一条线路的核心是DefaultListableBeanFactory这个类。在spring中,这个类是作为一个默认的具有完整功能的IoC容器来使用的。这个类持有一个private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap(256);用来存放spring中已经注册了的bean。注册过程是通过实现BeanDefinitionRegistry接口实现的。

可以看到,在beanDefinitionMap中,key为String类型,即bean的name。value为BeanDefinition。BeanDefinition是spring中一个很重要的类,在之后的文章中会详细提到。目前可以简单理解为spring对各种对象类型的统一封装。
在3.1以前,spring通过继承这个类来实现额外功能。例如XmlBeanFactory继承这个类,使用Resource对象读取XML文件进行解析。在3.1以后XmlBeanFactory这个类被弃用, 现在用ClassPathXmlApplicationContext这个类接续XML。

ApplicationContext

ApplicationContext继承树
第二条线的核心是ApplicationContext这个接口。ApplicationContext可以说是一个高级形态的IoC容器。它在IOC容器的基本功能上添加了一些附加功能。例如它继承了MessageSource接口用于支持国际化,ResourcePatternResolver接口用于从不同途径获取BeanDefinition。 正式由于ApplicationContext提供了一系列附加功能,与BeanFactory相比,对它的使用是一种面向框架的风格,在3.1以后,spring统一使用ApplicationContext作为IOC容器的基本形式。

这里先看一下ApplicationContext下游的继承关系。ApplicationContext下游直到 AbstractApplicationContext这个抽象类为止都只是单线。这个抽象类主要是实现了上游的接口方法。从该抽象类开始有两条线。第一条线是AbstractRefreshableApplicationContext类及其子类,这些类主要是以refreshable或资源类型名打头。另一条线是GenericApplicationContext类及其子类,主要以generic或static打头。

这两条线的主要区别在于对refresh()方法的处理。refresh()方法定义在上游AbstractApplicationContext类中,是一个模板方法。refresh()方法的主要作用是完成对IoC容器的初始化。同时也是spring响应hot reloading的底层方法。在AbstractRefreshableApplicationContext类及其子类中,持有一个private DefaultListableBeanFactory beanFactory。每次调用refresh()方法时,都会通过refreshBeanFactory()方法生成一个新beanFacory。而在GenericApplicationContext类及其子类中,持有一个private final DefaultListableBeanFactory beanFactory。该容器在类加载时即确定。在这条线的类中,refresh()方法能被调用一次。因而不能响应hot reloading。这条线的应用场景很少,在spring官方API中,也强调了如果想自定义ApplicationContext,最好继承AbstractRefreshableApplicationContext类。

从在AbstractRefreshableApplicationContext类再往下走,则是一些具体的实现类,这些类往往只需要实现与这个类设计具体相关的功能。例如我们最熟悉的ClassPathXmlApplicationContext类。它只需要实现XML读取与解析功能即可。

CATALOG
  1. 1. BeanFactory
  2. 2. DefaultListableBeanFactory
  3. 3. ApplicationContext