ApplicationContext(應用上下文)是使用spring框架的入口。深刻理解,運用ApplicationContext的每一個細節。會對spring的擴展,解決一些細節行問題。有巨大的幫助java
ApplicationContext接口會繼承許多其餘接口。如下是繼承的接口web
從英文單詞能夠看出是消息源,這個接口主要用於國際化操做。冒失國際化操做用得好少,JavaScript,或者後端又更加優秀的國際化操做的處理。因此MessageSource體系不會講解。spring
public interface MessageSource { String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale); String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException; String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException; }
從英文單詞能夠看出是環境變量(應用變量)管理。細節請看第五章 第一節 spring-connet之environment後端
public interface EnvironmentCapable { Environment getEnvironment(); }
請看beanFacrt框架
ApplicationEventPublisher接口所對應的子體系是ApplicationContext體系裏面一個很是重要的體系,是ApplicationContext控制的很是重要,若是深刻使用spring,ApplicationEventPublisher體系是應該掌握的。ApplicationEventPublisher的publishEvent()方法表示執行那個ApplicationContext的事件。spring-boot
public interface ApplicationEventPublisher { default void publishEvent(ApplicationEvent event) { publishEvent((Object) event); } void publishEvent(Object event); }
ResourcePatternResolver是你不會知道,也不會主動去了解的體系,但這個體系是ApplicationContext如今(如今,如今)最核心的基礎工具。用於加載資源。工具
public interface ResourcePatternResolver extends ResourceLoader { String CLASSPATH_ALL_URL_PREFIX = "classpath*:"; Resource[] getResources(String locationPattern) throws IOException; }
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver { String getId(); String getApplicationName(); String getDisplayName(); long getStartupDate(); ApplicationContext getParent(); AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException; }
生命週期,你們應該都懂的post
public interface Lifecycle { void start(); void stop(); boolean isRunning(); }
你們會很奇怪,Closeable的close方法與Lifecycle的stop是否是重複了。這個不必定。好比strat-stop-start 這種週期循環了。close等於宇宙直接毀滅了。可是若是stop也等於宇宙直接毀滅,那麼二者是相等的。沒事,我立馬拯救宇宙,如今宇宙進入和平時期。spa
public interface Closeable extends AutoCloseable { public void close() throws IOException; }
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable { void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor); void addApplicationListener(ApplicationListener<?> listener); void addProtocolResolver(ProtocolResolver resolver); void refresh() throws BeansException, IllegalStateException; void registerShutdownHook(); boolean isActive(); }
ConfigurableWebApplicationContext很簡單,加入了一些web項目須要的基本信息.net
public interface ConfigurableWebApplicationContext extends WebApplicationContext, ConfigurableApplicationContext { void setServletContext(ServletContext servletContext); void setServletConfig(ServletConfig servletConfig); ServletConfig getServletConfig(); void setNamespace(String namespace); String getNamespace(); void setConfigLocation(String configLocation); void setConfigLocations(String... configLocations); String[] getConfigLocations(); }
AnnotationConfigRegistry 有兩個方法聲明,第一個register是直接解析class。第二個scan是提供路徑,進行路徑掃描。
public interface AnnotationConfigRegistry { void register(Class<?>... annotatedClasses); void scan(String... basePackages); }
看了這個複雜的圖,是否是懵避了,先前鳥菜啊也懵得不行。不要急,待已經懵完的鳥菜啊,給你們解讀。
這個是加載classPath路徑,記住classPath是指的的jar包裏面或者bin目錄。
給予一個文件系統的地址,遠程加載xml文件
這個是從web的classPath路徑,也就是web.class目錄下加載
與ClassPathXmlApplicationContext加載方式同樣,只是其餘行爲不同
其餘都是
其餘都是
鳥菜啊已經暈過了,如今清醒了。找了兩個如今使用的ApplicationContext的切入。分別是AnnotationConfigApplicationContext與AnnotationConfigWebApplicationContext。請你們慢慢有耐心的聽鳥菜啊悠悠的講解。