ConfigurableApplicationContext
继承了 ApplicationContext 获得了其所有能力:环境、可列举获取bean的容器、层级关系的容器、消息、事件发送、资源解析器
继承了 Lifecycle 获得了生命周期管理的 开启组件、停止组件、获取当前组件是否运行的能力
继承了 Closeable 获得了关闭IO流的能力
增加了 设置唯一ID、设置父容器、设置环境、增加后置处理器、增加应用监听器、增加资源解析器、刷新配置等配置能力。
AbstractApplicationContext
继承了 DefaultResourceLoader 获得了 资源加载的能力
实现了ConfigurableApplicationContext 接口。对接口中方法提供了通用的默认实现。 模板方法模式
核心在 refresh 方法
AbstractRefreshableApplicationContext
继承了AbstractApplicationContext 实现了部分抽象方法,
提出了新的抽象方法 loadBeanDefinitions 子类根据自身特性进行具体实现
AbstractRefreshableConfigApplicationContext
继承了AbstractRefreshableApplicationContext
并提供了config locations 的公共处理器。
AbstractXmlApplicationContext
继承了 AbstractRefreshableConfigApplicationContext
提供了通过 XmlBeanDefinitionReader 加载配置文件注册bean为 BeanDefinition 的能力
子类只需要实现 getConfigResources 方法
其中获取ConfigResources 提供给子类一个hook函数,使其可以自定义指定的configresources 代码如下所示:
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
Resource[] configResources = getConfigResources();
if (configResources != null) { // 如返回不为null 钩子函数起作用了
reader.loadBeanDefinitions(configResources);
}
String[] configLocations = getConfigLocations();
if (configLocations != null) {
reader.loadBeanDefinitions(configLocations);
}
}
// 钩子函数,子类不重写直接使用默认实现
@Nullable
protected Resource[] getConfigResources() {
return null;
}
ClassPathXmlApplicationContext
继承了 AbstractXmlApplicationContext
提供了设置 configLocations , 设置父容器,refresh 的功能。