转自:https://blog.csdn.net/weixin_39165515/article/details/77169231

此接口结合了所有ApplicationContext需要实现的接口。因此大多数的ApplicationContext都要实现此接口。它在ApplicationContext的基础上增加了一系列配置应用上下文的功能。配置应用上下文和控制应用上下文生命周期的方法在此接口中被封装起来,以免客户端程序直接使用。

public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {

    /**
     * 应用上下文配置时,这些符号用于分割多个配置路径
     */
    String CONFIG_LOCATION_DELIMITERS = ",; \t\n";

    /**
     * BeanFactory中,ConversionService类所对应的bean的名字。如果没有此类的实例的话
     * 则使用默认的转换规则
     */
    String CONVERSION_SERVICE_BEAN_NAME = "conversionService";

    /**
     * LoadTimeWaver类所对应的Bean在容器中的名字。如果提供了该实例,上下文会使用临时的ClassLoader
     * 这样,LoadTimeWaver就可以使用bean确切的类型了
     */
    String LOAD_TIME_WEAVER_BEAN_NAME = "loadTimeWeaver";

    /**
     * Environment类在容器中实例的名字
     */
    String ENVIRONMENT_BEAN_NAME = "environment";

    /**
     * System系统变量在容器中对应的Bean的名字
     */
    String SYSTEM_PROPERTIES_BEAN_NAME = "systemProperties";

    /**
     * System 环境变量在容器中对应的Bean的名字
     */
    String SYSTEM_ENVIRONMENT_BEAN_NAME = "systemEnvironment";


    /**
     * 设置容器的唯一ID
     */
    void setId(String id);

    /**
     * 设置此容器的父容器
     * 需要注意的是,父容器一经设定就不应该修改。并且一般不会在构造方法中对其进行配置,因为很多时候。
     * 其父容器还不可用。比如WebApplicationContext。
     */
    void setParent(ApplicationContext parent);

    /**
     * 设置容器的Environment变量
     */
    void setEnvironment(ConfigurableEnvironment environment);

    /**
     * 以COnfigurableEnvironment的形式返回此容器的环境变量。以使用户更好的进行配置
     */
    @Override
    ConfigurableEnvironment getEnvironment();

    /**
     * 此方法一般在读取应用上下文配置的时候调用,用以向此容器中增加BeanFactoryPostProcessor。
     * 增加的Processor会在容器refresh的时候使用。
     */
    void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);

    /**
     * 向容器增加一个ApplicationListener,增加的Listener用于发布上下文事件如refresh和shutdown等
     * 需要注意的是,如果此上下文还没有启动,那么在此注册的Listener将会在上下文refresh的时候,全部被调用
     * 如果上下文已经是active状态的了,就会在multicaster中使用
     */
    void addApplicationListener(ApplicationListener<?> listener);

    /**
     * 向容器中注入给定的Protocol resolver,允许多个实例同时存在。
     * 在此注册的每一个resolver都将会在上下的标准解析规则之前使用。因此,某种程度上来说
     * 这里注册的resolver可以覆盖上下文的resolver
     */
    void addProtocolResolver(ProtocolResolver resolver);

    /**
     * 加载资源配置文件(XML、properties,Whatever)。
     * 由于此方法是一个初始化方法,因此如果调用此方法失败的情况下,要将其已经创建的Bean销毁。
     * 换句话说,调用此方法以后,要么所有的Bean都实例化好了,要么就一个都没有实例化
     */
    void refresh() throws BeansException, IllegalStateException;

    /**
     * 向JVM注册一个回调函数,用以在JVM关闭时,销毁此应用上下文。
     */
    void registerShutdownHook();

    /**
     * 关闭此应用上下文,释放其所占有的所有资源和锁。并销毁其所有创建好的singleton Beans
     * 实现的时候,此方法不应该调用其父上下文的close方法,因为其父上下文具有自己独立的生命周期
     * 多次调用此方法,除了第一次,后面的调用应该被忽略。
     */
    @Override
    void close();

    /**
     * 检测此FactoryBean是否被启动过。
     */
    boolean isActive();

    /**
     * 返回此应用上下文的容器。
     * 千万不要使用此方法来对BeanFactory生成的Bean做后置处理,因为单例Bean在此之前已经生成。
     * 这种情况下应该使用BeanFactoryPostProcessor来在Bean生成之前对其进行处理。
     * 通常情况下,内容容器只有在上下文是激活的情况下才能使用。因此,在使用此方法前,可以调用
     * isActive来判断容器是如可用
     */
    ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;

}
posted on 2019-05-18 15:06  Sharpest  阅读(4791)  评论(0编辑  收藏  举报