Spring IOC 学习三 之 ApplicationContext容器面纱

第一篇:Spring IOC学习一

第二篇:Spring IOC学习二 之资源加载


有第一篇已经知道整个Spring IOC的最核心体系就是 ApplicationContext 本文就对这个体系进行学习一下。第一篇就说了ApplicationContext是Spring真正的高级容器。它比BeanFactory高级在哪里?

1、继承了MessageSource 提供了国际化标准访问策略

2、继承了ApplicationEventPublisher 提供了强大的事件机制

3、扩展了ResourceLoader接口,使其能批量加载资源配置

4、支持web应用

 

Spring IOC 学习三 之 ApplicationContext容器面纱

重新补一下图

由上图就可以明了的看到整个ApplicationContext 的大致体系结构

ApplicationContext 的两个直接子类:

1、WebApplicationContext

Spring IOC 学习三 之 ApplicationContext容器面纱

该 接口的唯一方法就是为了给servlet 提供上下文接口

2、ConfigurableApplicationContext

Spring IOC 学习三 之 ApplicationContext容器面纱

以上是主要的方法

ConfigurableApplicationContext 不仅仅继承了ApplicationContext 同时还有 Lifecycle和 Closeable。这两个接口的作用是什么?

1、Lifecycle 包含了是三个方法:stop,start ,isRunning 这是Spring 容器提供的对生命周期的管理,

2、Closeable 进去看就会发现就一个方法,close 这是JDK提供的一个接口,用于关闭组件释放资源用的。


WebApplicationContext 和 ConfigurableApplicationContext 从接口接口上就会发现他们有共同的子类ConfigurableWebApplicationContext,该类是上面两个的整合,以及扩展了其他方法,


ClassPathXmlApplicationContext 是我们最常见的Spring IOC容器。这个类是整个IOC容器的最终实现类之一,它包含了1个方法和多个构造方法,除了一个无参的构造方法外,一个ApplicationContext 参数的构造方法外,其余所有的有参构造法最终都会执行一下2个方法的一种

Spring IOC 学习三 之 ApplicationContext容器面纱

第一种

Spring IOC 学习三 之 ApplicationContext容器面纱

第二种

第一种是手动控制是否刷新容器,第二种是每次都刷新

第一种是根据资源位置数组 最终在父类AbstractRefreshableConfigApplicationContext中实现bean资源的定位,第二种是跟自己资源位置相对或绝对路径数组,基于给定资源加载资源的类 实例化ClassPathResource对象。

首先 super(parent) 最终是调用父类的构造方法,为容器设置好Bean资源的加载器,如下代码

Spring IOC 学习三 之 ApplicationContext容器面纱

Spring IOC 学习三 之 ApplicationContext容器面纱

PathMatchingResourcePatternResolver是创建可批量加载资源的超级接口

setConfigLocations 方法,有单字符串形式和数组形式两种。ClassPathXMLApplicationContext是后者,FileSystemXMLApplicationContext是用的第一种

Spring IOC 学习三 之 ApplicationContext容器面纱

接下来就是refresh()方法,该方法最终也是要再父类中实现下面就是整个方法的说明

Spring IOC 学习三 之 ApplicationContext容器面纱

Spring IOC 学习三 之 ApplicationContext容器面纱

Spring IOC 学习三 之 ApplicationContext容器面纱


Spring IOC 学习三 之 ApplicationContext容器面纱

主要实现是 refreshBeanFactory()和返回容器实例

Spring IOC 学习三 之 ApplicationContext容器面纱

refreshBeanFactory 和getBeanFactory都是抽象方法,都是在子类AbstractRefreshableApplicationContext中进行实现的,如下图:

Spring IOC 学习三 之 ApplicationContext容器面纱

loadBeanDefinitions()具体实现也是在子类AbstractXmlApplicationContext 实现的。接下来就要进入BeanDefinition体系了

refresh()方法的作用是:在创建IoC容器前,如果已经有容器存在,则需要把已有的容器销毁和关闭,以保证在refresh之后使用的是新建立起来的IoC容器。refresh的作用类似于对IoC容器的重启,在新建立好的容器中对容器进行初始化,对Bean定义资源进行载入