ApplicationContext的孩子们

    科技2025-01-17  6

    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 的功能。

    Processed: 0.009, SQL: 8