ConfigurableApplicationContext

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


public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {


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


/**
* 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);


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


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


/**
* 以可配置的形式返回此容器的环境变量,用户可以更好的进行配置
*/
@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;


}

 

ConfigurableEnvironment :提供设置活动和默认配置文件以及操作底层属性源的工具。

BeanFactoryPostProcessor :允许自定义修改应用程序上下文的bean定义,调整上下文的底层bean工厂的bean属性值。应用程序上下文可以在它们的bean定义中自动检测BeanFactoryPostProcessor bean,并在创建任何其他bean之前应用它们。BeanFactoryPostProcessor可以与bean定义交互和修改,但从不实例化bean。因为这样做可能导致过早BEAN实例化,违反容器,并造成意想不到的副作用。如果需要与bean实例交互,建议实现BeanPostProcessor

ProtocolResolver:协议专用资源句柄的解析策略。用作{@link DefaultResourceLoader}的SPI,允许在不对加载器实现(或应用程序上下文实现)进行子类的情况下处理自定义协议

ConfigurableListableBeanFactory :配置接口由最大多数的bean工厂来实现。基于{@link ConfigurableBeanFactory},它还提供了分析和修改bean定义以及预实例化单例的工具。

ApplicationListener :父类EventListener,用于被应用的事件监听器实现,基于{@code java.util.EventListener} 接口的观察者模式的实现,从Spring3.0开始ApplicationListener可以声明它感兴趣的事件类型,当在Spring ApplicationContext中注册时,将相应地过滤事件,只调用侦听器来匹配事件对象。

ConfigurableApplicationContext:父类 Lifecycle, Closeable,ApplicationContext

SPI接口由大多数甚至不是所有的应用程序上下文来实现。除了{@link org.springframework.context.ApplicationContext}接口中的应用程序上下文客户端方法之外,还提供配置应用程序上下文的工具。配置和生命周期方法被封装在这里,以避免使它们对ApplicationContext client暴露,本方法仅适用于启动和关闭代码。

 
原文地址:https://www.cnblogs.com/QianYue111/p/13807655.html