Spring源码阅读:IOC容器的设计与实现(二)——ApplicationContext

 

 上一主题中,了解了IOC容器的基本概念,以及BeanFactory的设计与实现方式,这里就来了解一下ApplicationContext方式的实现。

 

ApplicationContext

 

    在Spring的参考文档中,为啥要推荐使用ApplicationContext?它能给我们的应用带来什么好处呢?作为BeanFactory的实现之一,它又是如何设计的?在SpringMVC中使用的WebApplictionContext\XmlApplicationContext与之有何关联?

    ApplicationContext与BeanFactory:

 

 

从类图中,可以明显的看出ApplicationContext是作为BeanFactory的子接口呈现的。但是它又在BeanFactory的基础上添加了新的特性:MessageSource(消息支持,例如国际化),ApplicationEventPublisher(事件支持),ResourcePatternResolver(解析资源)。

 

 

AbstractApplicationContext

在ApplicationContext的实现类AbstractApplicationContext已经基本上实现了ApplicationContext的功能。

 

/**

 * Abstract implementation of the {@link org.springframework.context.ApplicationContext}

 * interface. Doesn‘t mandate the type of storage used for configuration; simply

 * implements common context functionality. Uses the Template Method design pattern,

 * requiring concrete subclasses to implement abstract methods.

 *

 * <p>In contrast to a plain BeanFactory, an ApplicationContext is supposed

 * to detect special beans defined in its internal bean factory:

 * Therefore, this class automatically registers

 * {@link org.springframework.beans.factory.config.BeanFactoryPostProcessor BeanFactoryPostProcessors},

 * {@link org.springframework.beans.factory.config.BeanPostProcessor BeanPostProcessors}

 * and {@link org.springframework.context.ApplicationListener ApplicationListeners}

 * which are defined as beans in the context.

 *

 * <p>A {@link org.springframework.context.MessageSource} may also be supplied

 * as a bean in the context, with the name "messageSource"; otherwise, message

 * resolution is delegated to the parent context. Furthermore, a multicaster

 * for application events can be supplied as "applicationEventMulticaster" bean

 * of type {@link org.springframework.context.event.ApplicationEventMulticaster}

 * in the context; otherwise, a default multicaster of type

 * {@link org.springframework.context.event.SimpleApplicationEventMulticaster} will be used.

 *

 * <p>Implements resource loading through extending

 * {@link org.springframework.core.io.DefaultResourceLoader}.

 * Consequently treats non-URL resource paths as class path resources

 * (supporting full class path resource names that include the package path,

 * e.g. "mypackage/myresource.dat"), unless the {@link #getResourceByPath}

 * method is overwritten in a subclass.

 */
View Code

 

上面的描述的大致意思是: 

1、这个类是对ApplicationContext的抽象的实现,并不会指定使用哪种bean definition 配置策略。它完成了各种ApplicationContext的通用的实现。在设计这个类时,使用了模板方法设计模式,有的方法需要在具体的子类中实现。

2、与BeanFactory相比,ApplicationContxt中可以把BeanFactoryPostProcessor、BeanPostProcessor、ApplicationListener作为一个普通的Bean定义。

3、在ApplicationContext中也可以使用MessageSource,使用它时用的name是"messageSource"。同时也可以使用ApplicationEventMulticaster(name是"applicationEventMulticaster"),如果不指定,默认使用的是:SimpleApplicationEventMulticaster。

4、通过继承DefaultResourceLoader方式实现了资源文件的加载。

 

接下来看看这个类的继承关系:

 

 

从类图中可以看出AbstractApplicationContext主要分为两支:   ·AbstractRefreshWebApplicationContext(主要用于Web环境下)

    ·AbstractXmlApplicationContext(主要用于非Web环境下)

 

对于AbstractRefreshWebApplicationContext,从配置类别上分为两类:使用Annotation配置或者使用XML文件配置。

 

对于AbstractXmlApplicationContext,采用的是XML作为Bean定义的配置文件,它的两个子类的区别是从哪里去加载bean定义件。

 下一节,就可以看看ApplicationContext是如何初始化IOC容器的。

 

Spring源码阅读:IOC容器的设计与实现(二)——ApplicationContext,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。