轉自: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; }