第五章 spring-context之ApplicationContext体系

前言

ApplicationContext(应用上下文)是使用spring框架的入口。深刻理解,运用ApplicationContext的每一个细节。会对spring的扩展,解决一些细节行问题。有巨大的帮助java

ApplicationContext接口体系

ApplicationContext接口会继承许多其余接口。如下是继承的接口web

MessageSource

从英文单词能够看出是消息源,这个接口主要用于国际化操做。冒失国际化操做用得好少,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;
}

EnvironmentCapable

从英文单词能够看出是环境变量(应用变量)管理。细节请看第五章 第一节 spring-connet之environment后端

public interface EnvironmentCapable {
	Environment getEnvironment();
}

HierarchicalBeanFactory 与 ListableBeanFactory

请看beanFacrt框架

ApplicationEventPublisher

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

ResourcePatternResolver是你不会知道,也不会主动去了解的体系,但这个体系是ApplicationContext如今(如今,如今)最核心的基础工具。用于加载资源。工具

public interface ResourcePatternResolver extends ResourceLoader {
	String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

	Resource[] getResources(String locationPattern) throws IOException;
}

ApplicationContext

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

	String getId();

	String getApplicationName();

	String getDisplayName();

	long getStartupDate();

	ApplicationContext getParent();

	AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;

}

Lifecycle

生命周期,你们应该都懂的post

public interface Lifecycle {

	void start();

	void stop();

	boolean isRunning();
}

Closeable

你们会很奇怪,Closeable的close方法与Lifecycle的stop是否是重复了。这个不必定。好比strat-stop-start 这种周期循环了。close等于宇宙直接毁灭了。可是若是stop也等于宇宙直接毁灭,那么二者是相等的。没事,我立马拯救宇宙,如今宇宙进入和平时期。spa

public interface Closeable extends AutoCloseable {

    public void close() throws IOException;
}

ConfigurableApplicationContext

  1. BeanFactoryPostProcessor接口及子接口BeanDefinitionRegistryPostProcessor是spring ApplicationContext一个很是重要的一个体系,spring-boot使用spi体系,就应该废除这个体系了。
  2. ApplicationListener 事件执行
  3. ProtocolResolver,用于对加载的资源进行处理
  4. refresh方法是核心方法,会有一节专门说。
  5. isActive方法是肯定ApplicationContext是否正常启动。
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

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();

}

非ApplicationContext接口继承的其余接口体系

AnnotationConfigRegistry接口

AnnotationConfigRegistry 有两个方法声明,第一个register是直接解析class。第二个scan是提供路径,进行路径扫描。

public interface AnnotationConfigRegistry {

	void register(Class<?>... annotatedClasses);

	void scan(String... basePackages);

}

ApplicationContext 实现体系

看了这个复杂的图,是否是懵避了,先前鸟菜啊也懵得不行。不要急,待已经懵完的鸟菜啊,给你们解读。

资源加载的维度

加载xml文件
  1. ClassPathXmlApplicationContext

    这个是加载classPath路径,记住classPath是指的的jar包里面或者bin目录。

  2. FileSystemXmlApplicationContext

    给予一个文件系统的地址,远程加载xml文件

  3. XmlWebApplicationContext

    这个是从web的classPath路径,也就是web.class目录下加载

  4. GenericXmlApplicationContext

    与ClassPathXmlApplicationContext加载方式同样,只是其余行为不同

加载groovy语言的文件
  1. GroovyWebApplicationContext
  2. GenericGroovyApplicationContext
加载annitation
  1. AnnotationConfigApplicationContext
  2. AnnotationConfigWebApplicationContext
手动注入bean
  1. GenericApplicationContext
  2. ResourceAdapterApplicationContext
  3. StaticApplicationContext
  4. StaticWebApplicationContext

使用环境维度

web应用
  1. AnnotationConfigWebApplicationContext
  2. AnnotationConfigApplicationContext
  3. GenericWebApplicationContext
  4. StaticWebApplicationContext

正常项目维度

其余都是

Refreshable

Refreshable特性

  1. AnnotationConfigWebApplicationContext
  2. GroovyWebApplicationContext
  3. XmlWebApplicationContext
  4. ClassPathXmlApplicationContext
  5. FileSystemXmlApplicationContext

非Refreshable特性

其余都是

晕了吧

鸟菜啊已经晕过了,如今清醒了。找了两个如今使用的ApplicationContext的切入。分别是AnnotationConfigApplicationContext与AnnotationConfigWebApplicationContext。请你们慢慢有耐心的听鸟菜啊悠悠的讲解。

相关文章
相关标签/搜索