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。请你们慢慢有耐心的听鸟菜啊悠悠的讲解。