第一篇:Spring IOC学习一
有第一篇已经知道整个Spring IOC的最核心体系就是 ApplicationContext 本文就对这个体系进行学习一下。第一篇就说了ApplicationContext是Spring真正的高级容器。它比BeanFactory高级在哪里?
1、继承了MessageSource 提供了国际化标准访问策略
2、继承了ApplicationEventPublisher 提供了强大的事件机制
3、扩展了ResourceLoader接口,使其能批量加载资源配置
4、支持web应用
由上图就可以明了的看到整个ApplicationContext 的大致体系结构
ApplicationContext 的两个直接子类:
1、WebApplicationContext
2、ConfigurableApplicationContext
ConfigurableApplicationContext 不仅仅继承了ApplicationContext 同时还有 Lifecycle和 Closeable。这两个接口的作用是什么?
1、Lifecycle 包含了是三个方法:stop,start ,isRunning 这是Spring 容器提供的对生命周期的管理,
2、Closeable 进去看就会发现就一个方法,close 这是JDK提供的一个接口,用于关闭组件释放资源用的。
WebApplicationContext 和 ConfigurableApplicationContext 从接口接口上就会发现他们有共同的子类ConfigurableWebApplicationContext,该类是上面两个的整合,以及扩展了其他方法,
ClassPathXmlApplicationContext 是我们最常见的Spring IOC容器。这个类是整个IOC容器的最终实现类之一,它包含了1个方法和多个构造方法,除了一个无参的构造方法外,一个ApplicationContext 参数的构造方法外,其余所有的有参构造法最终都会执行一下2个方法的一种
第一种是手动控制是否刷新容器,第二种是每次都刷新
第一种是根据资源位置数组 最终在父类AbstractRefreshableConfigApplicationContext中实现bean资源的定位,第二种是跟自己资源位置相对或绝对路径数组,基于给定资源加载资源的类 实例化ClassPathResource对象。
首先 super(parent) 最终是调用父类的构造方法,为容器设置好Bean资源的加载器,如下代码
PathMatchingResourcePatternResolver是创建可批量加载资源的超级接口
setConfigLocations 方法,有单字符串形式和数组形式两种。ClassPathXMLApplicationContext是后者,FileSystemXMLApplicationContext是用的第一种
接下来就是refresh()方法,该方法最终也是要再父类中实现下面就是整个方法的说明
refresh()方法的作用是:在创建IoC容器前,如果已经有容器存在,则需要把已有的容器销毁和关闭,以保证在refresh之后使用的是新建立起来的IoC容器。refresh的作用类似于对IoC容器的重启,在新建立好的容器中对容器进行初始化,对Bean定义资源进行载入