> 文档中心 > Spring IoC原理(一) BeanFactory和ApplicaitonContext

Spring IoC原理(一) BeanFactory和ApplicaitonContext


Spring IoC原理(一) BeanFactory和ApplicationContext

文章目录

  • Spring IoC原理(一) BeanFactory和ApplicationContext
  • 一、BeanFactory
    • 1.BeanFactory继承关系
    • 2.BeanFactory应用场景
    • 3.BeanFactory设计原理
  • 二、ApplicationContext
    • 1.ApplicationContext继承关系
    • 2.ApplicationContext应用场景
    • 3.ApplicationContext设计原理
  • 三、结论

一、BeanFactory

1.BeanFactory继承关系

    IoC容器包含一系功能各异的容器产品,各个容器的功能不用、应用场景不同。以生活中的水桶为例,水桶的主要功能为装水,而在商店中会有各种类型的水桶售卖,有金属的、塑料的等。而无论水桶是哪种款式都应满足水桶的最基本的功能,如能够装水、有提手等。同样的,IoC容器作为Spring中的容器,其应该具有最基本的功能规范,这个功能规范的设计表现为BeanFactory,即BeanFactory定义了IoC容器的基本功能。

Spring IoC原理(一) BeanFactory和ApplicaitonContext
图1-1 BeanFactory继承关系     如图1-1所示,IoC容器中的各个BeanFactory均以BeanFactory为基础,在此基础上进行其他功能的开发。

2.BeanFactory应用场景

    BeanFactory接口定义了IoC容器的最基本的形式,这些接口定义勾画出了IoC容器的基本轮廓。由于BeanFactory仅是一个接口类,并没有有给出容器的具体实现,因此在图1-1中所看到的类均可以看成是容器附加某种功能的具体实现,也就是容器体系中的具体容器产品。

Spring IoC原理(一) BeanFactory和ApplicaitonContext
图1-2 BeanFactory接口内的方法     如图1-2所示为BeanFactory接口内所有定义的方法,主要方法如下:

  • getBean:该方法为IoC容器API的主要方法,通过这个方法可以取得IoC容器中管理的Bean。
  • containsBean:判断容器内是否含有指定名字的Bean。
  • isSingleton:查询指定名字的Bean是否为Singleton类型。
  • isPrototype:查询指定名字的Bean是否为Prototype类型。
  • isTypeMatch:查询指定名字的Bean是否为特性的Class类型。
  • getType:查询指定名字的Bean的Class类型。
  • getAliases:查询指定名字的Bean的所有别名。

3.BeanFactory设计原理

    以XmlBeanFactory为例进行BeanFactory的设计原理说明,图1-3为XmlBeanFactory的继承关系。在BeanFactory接口的基础上,每进行一次继承就会对原有的IoC容器功能进行增强,XMLBeanFactory在继承DefaultListableBeanFactory容器功能的同时,增加了与xml文件读取相关功能。而在Spring中,实际上是DefaultListableBeanFactory作为一个默认的功能完整的IoC容器来使用的,目前XMLBeanFactory已过时。

Spring IoC原理(一) BeanFactory和ApplicaitonContext
图1-3 XmlBeanFactory继承关系

二、ApplicationContext

1.ApplicationContext继承关系

    如图2-1所示,ApplicationContext同时继承了HierarchicalBeanFactory和ListableBeanFactory两个接口,并在此基础上进行功能增强。

Spring IoC原理(一) BeanFactory和ApplicaitonContext
图2-1 ApplicationContext继承关系

2.ApplicationContext应用场景

    IoC容器中所包含的扩展BeanFactory的容器能够满足开发人员的基本需求,而ApplicationContext可为用户提供额外的附加服务,能够让用户更加方便地使用,可以看作为高级形态意义的IoC容器。从图2-1中可以看出,ApplicationContext通过继承不同的接口添加多个附加功能:

  • 支持不同的信息源。ApplicationContext扩展了MessageSource接口,能够支持国际化,为开发多语言版本的应用提供服务。
  • 访问资源。ApplicationContext继承了ResourcePatternResolver接口,能够从不同地方得到Bean定义资源。但在具体的ApplicationContext实现类中,则是通过继承DefaultResourceLoader实现对资源的访问。
  • 支持应用事件。ApplicationContext继承了ApplicationEventPublisher,在上下文中引入了事件机制。这些事件和Bean的生命周期的结合为Bean的管理提供了方便。

Spring IoC原理(一) BeanFactory和ApplicaitonContext
图2-2 ApplicationContext接口内的方法     此外,如图2-2所示,ApplicationContext中提供了额外的附加服务,主要方法如下:

  • getId:获取当前ApplicationContext的id。
  • getApplicationName:获取当前ApplicationContext的名称。
  • getDisplayName:获取当前ApplicationContext的显示名称。
  • getStartupDate::获取当前ApplicationContext第一次载入的时间。
  • getParent:获取当前ApplicationContext的父上下文。
  • getAutoWireCapableBeanFactory:获取当前ApplicationContext的AutowireCapableBeanFactory。

3.ApplicationContext设计原理

    以FileSystemXmlApplicationContext为例进行ApplicationContext容器的设计原理说明,如图2-3为FileSystemXmlApplicationContext的继承关系。Application的具体功能已经在FileSystemXmlApplication Context的基类AbstractXmlApplicationContext中实现,而FileSystemXmlApplicationContext仅需要在此基础上进行与自身相关的功能实现。

Spring IoC原理(一) BeanFactory和ApplicaitonContext
图2-3 FileSystemXmlApplicationContext继承关系     FileSystemXmlApplicationContext有两个功能,启动IoC容器初始化过程和加载XML的Bean定义资源。

启动IoC容器初始化
   过程如果应用使用FileSystemXmlApplicationContext,需通过FileSystemXmlApplicationContext完成应用上下文初始化,同时启动IoC容器的refresh()过程,相关代码如下:

public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(configLocations);if (refresh) {refresh();}}

通过调用refresh()方法将展开IoC容器相关的一系列操作,后续将会进行详细介绍,此处不再展开。
加载XML的Bean定义资源
   加载XML文件资源是FileSystemXmlApplicationContext的特殊功能,在ApplicationContext中对于访问资源功能扩展是通过继承ResourcePatternResolver接口实现的,该接口的父类为ResourceLoader接口,而ResourcePatternResolver并未提供具体的解决方案,在FileSystemXmlApplicationContext中则是通过继承DefaultResourceLoader实现对资源的访问,如图2-4所示。

Spring IoC原理(一) BeanFactory和ApplicaitonContext
图2-3 AbstractApplicationContext继承关系 对于XML资源读取的具体实现方式如下:

protected Resource getResourceByPath(String path) {if (path.startsWith("/")) {path = path.substring(1);}return new FileSystemResource(path);}

三、结论

  1. BeanFactory定义了IoC容器的基础功能,为IoC容器制定了功能规范。通过BeanFactory提供的接口可以获得容器中Bean的相关信息。
  2. ApplicationContext对BeanFactory功能进行扩展,提供更丰富的功能:
    a. 支持不同的信息源
    b. 访问资源
    c. 支持应用事件
    d. ApplicationContext相关功能,通过调用相关接口能够获取更加详细的上下文信息。

麦克风网