概述
这次了解一下ApplicationContext的继承关系。尽管这样学习一次后不可能记住所有的类,但是对ApplicationContext有了一定的轮廓,不再是两眼一抹黑。
常用的ApplicationContext
- SpringBoot中常用的两个ApplicationContext,主要有以下两个:
- 常规应用:org.springframework.context.annotation.AnnotationConfigApplicationContext;
- Web应用:org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
- 常用的ApplicationContext的主要功能
- 包括消息解析、bean工厂的基本功能(bean的注册、实例化、初始化)、context中事件的发布、资源加载与解析、上下文配置、bean销毁等主要功能;
继承关系
各个类的作用
- public interface EnvironmentCapable {……}
- 作用:所有Spring应用程序上下文都是EnvironmentCapable,该接口主要用于在接受BeanFactory实例的框架方法中执行{@code instanceof}检查,这些实例可能实际上也可能不是ApplicationContext实例,以便在环境可用时与环境进行交互。
- 方法
- Environment getEnvironment();
- public interface MessageSource {……}
- 作用:用于解析消息的策略接口,支持此类消息的参数化和国际化。
- 方法
- String getMessage(String code, Object[] args, String defaultMessage, Locale locale);
- String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException;
- String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;
- public interface ApplicationEventPublisher {……}
- 作用:封装事件发布功能的接口。 用作{@link ApplicationContext}的超级接口。
- 方法
- void publishEvent(ApplicationEvent event);
- void publishEvent(Object event);
- public interface ResourcePatternResolver extends ResourceLoader {……}
- 作用
- 用于将位置模式(例如,Ant样式路径模式)解析为Resource对象的策略接口。
- 这是{@link org.springframework.core.io.ResourceLoader}接口的扩展。 可以检查传入的ResourceLoader(例如,在上下文中运行时通过{@link org.springframework.context.ResourceLoaderAware}传入的{@link org.springframework.context.ApplicationContext})是否实现此扩展接口 太。 {@link PathMatchingResourcePatternResolver}是一个独立的实现,可以在ApplicationContext之外使用,也被{@link ResourceArrayPropertyEditor}用于填充Resource数组bean属性
- 方法
- String CLASSPATH_ALL_URL_PREFIX = “classpath*:”;
- Resource[] getResources(String locationPattern) throws IOException;
- 作用
- public interface ResourceLoader {……}
- 作用:用于加载资源的策略接口(例如,类路径或文件系统资源)。 需要{@link org.springframework.context.ApplicationContext}来提供此功能,以及扩展的{@link org.springframework.core.io.support.ResourcePatternResolver}支持。
- 方法
- ClassLoader getClassLoader();
- Resource getResource(String location);
- ClassLoader getClassLoader();
- public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {……}
- 作用:用于为应用程序提供配置的中央接口。 这在应用程序运行时是只读的,但如果实现支持,则可以重新加载。
- 方法
- String getId();
- String getApplicationName();
- String getDisplayName();
- long getStartupDate();
- ApplicationContext getParent();
- AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
- public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {……}
- 作用
- SPI接口由大多数(如果不是全部)应用程序上下文实现。 除了{@link org.springframework.context.ApplicationContext}接口中的应用程序上下文客户端方法之外,还提供配置应用程序上下文的工具。
- 这里封装了配置和生命周期方法,以避免使它们对ApplicationContext客户端代码显而易见。 本方法只能由启动和关闭代码使用
- 方法
- String CONFIG_LOCATION_DELIMITERS = “,; \t\n”;
- String CONVERSION_SERVICE_BEAN_NAME = “conversionService”;
- String LOAD_TIME_WEAVER_BEAN_NAME = “loadTimeWeaver”;
- String ENVIRONMENT_BEAN_NAME = “environment”;
- String SYSTEM_PROPERTIES_BEAN_NAME = “systemProperties”;
- String SYSTEM_ENVIRONMENT_BEAN_NAME = “systemEnvironment”;
- void setId(String id);
- void setParent(ApplicationContext parent);
- void setEnvironment(ConfigurableEnvironment environment);
- ConfigurableEnvironment getEnvironment();
- void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);
- void addApplicationListener(ApplicationListener< ?> listener);
- void addProtocolResolver(ProtocolResolver resolver);
- void refresh() throws BeansException, IllegalStateException;
- void registerShutdownHook();
- void close();
- boolean isActive();
- ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
- 作用
- public interface Lifecycle {……}
- 作用:定义启动/停止生命周期控制方法的通用接口。 这种情况的典型用例是控制异步处理。 注意:此接口并不意味着特定的自动启动语义。 考虑为此目的实施{@link SmartLifecycle}
- 方法
- void start();
- void stop();
- boolean isRunning();
- 作用:定义启动/停止生命周期控制方法的通用接口。 这种情况的典型用例是控制异步处理。 注意:此接口并不意味着特定的自动启动语义。 考虑为此目的实施{@link SmartLifecycle}
- public interface Closeable extends AutoCloseable {……}
- 作用:{@code Closeable}是可以关闭的数据的来源或目的地。 调用close方法以释放对象所持有的资源(例如打开的文件)。
- 方法
- public void close() throws IOException;
- public interface WebApplicationContext extends ApplicationContext {……}
- 作用:用于为Web应用程序提供配置的接口。 这在应用程序运行时是只读的,但如果实现支持,则可以重新加载。
- 方法
- String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() +”.ROOT”;
- String SCOPE_REQUEST = “request”;
- String SCOPE_SESSION = “session”;
- String SCOPE_GLOBAL_SESSION = “globalSession”;
- String SCOPE_APPLICATION = “application”;
- String SERVLET_CONTEXT_BEAN_NAME = “servletContext”;
- String CONTEXT_PARAMETERS_BEAN_NAME = “contextParameters”;
- String CONTEXT_ATTRIBUTES_BEAN_NAME = “contextAttributes”;
- ServletContext getServletContext();
- public interface DisposableBean {……}
- 作用:要在销毁时释放资源的bean实现的接口。 如果BeanFactory处理缓存的单例,则应该调用destroy方法。 应用程序上下文应该关闭所有单例。
- 方法
- void destroy() throws Exception;
- public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean {……}
- 作用
- {@link org.springframework.context.ApplicationContext}接口的抽象实现。 不要求用于配置的存储类型; 只需实现常见的上下文功能 使用Template Method设计模式,需要具体的子类来实现抽象方法。
- 与普通BeanFactory相比,ApplicationContext应该检测在其内部bean工厂中定义的特殊bean:因此,该类自动注册{@link org.springframework.beans.factory.config.BeanFactoryPostProcessor BeanFactoryPostProcessors},{@ link org。 springframework.beans.factory.config.BeanPostProcessor BeanPostProcessors}和{@link org.springframework.context.ApplicationListener ApplicationListeners},它们在上下文中定义为bean。
- 作用
- public class DefaultResourceLoader implements ResourceLoader {……}
- 作用:{@link ResourceLoader}接口的默认实现。 由{@link ResourceEditor}使用,并作为{@link org.springframework.context.support.AbstractApplicationContext}的基类。 也可以单独使用。
- public interface BeanDefinitionRegistry extends AliasRegistry {……}
- 作用:包含bean定义的注册表的接口,例如RootBeanDefinition和ChildBeanDefinition实例。 通常由BeanFactories实现,BeanFactories内部使用AbstractBeanDefinition层次结构
- 方法
- void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException;
- void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
- BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
- boolean containsBeanDefinition(String beanName);
- String[] getBeanDefinitionNames();
- int getBeanDefinitionCount();
- boolean isBeanNameInUse(String beanName);
- public class GenericWebApplicationContext extends GenericApplicationContext implements ConfigurableWebApplicationContext, ThemeSource {……}
- 作用:实现{@link org.springframework.web.context.ConfigurableWebApplicationContext},但不用于{@code web.xml}中的声明性设置。 相反,它是为程序设置而设计的,例如用于构建嵌套上下文或在Spring 3.1 {@link org.springframework.web.WebApplicationInitializer}中使用。
- public interface ThemeSource {……}
- 作用:由可以解析{@link Theme Themes}的对象实现的接口。 这使得给定“主题”的消息的参数化和国际化成为可能。
- public class EmbeddedWebApplicationContext extends GenericWebApplicationContext {……}
- 作用
- 此上下文将通过在{@link ApplicationContext}本身内搜索单个{@link EmbeddedServletContainerFactory} bean来创建,初始化和运行{@link EmbeddedServletContainer}。 {@link EmbeddedServletContainerFactory}可以自由使用标准的Spring概念(例如依赖注入,生命周期回调和属性占位符变量)。
- 此外,上下文中定义的任何{@link Servlet}或{@link Filter} bean都将自动注册到嵌入式Servlet容器中。 对于单个Servlet bean,将使用’/’映射。 如果找到多个Servlet bean,则小写bean名称将用作映射前缀。 名为’dispatcherServlet’的任何Servlet将始终映射到’/’。 过滤器bean将映射到所有URL(’/ *’)。
- 作用
- public class XmlEmbeddedWebApplicationContext extends EmbeddedWebApplicationContext {……}
- 作用:{@link EmbeddedWebApplicationContext},它从XML文档获取其配置,由{@link org.springframework.beans.factory.xml.XmlBeanDefinitionReader}解析
- public class AnnotationConfigEmbeddedWebApplicationContext extends EmbeddedWebApplicationContext {……}
- 作用:{@link EmbeddedWebApplicationContext}接受带注释的类作为输入 - 特别是{@link org.springframework.context.annotation.Configuration @Configuration}注释类,还有普通的{@link Component @Component}类和JSR-330兼容类 使用{@code javax.inject}注释。 允许逐个注册类(将类名指定为配置位置)以及类路径扫描(将基本包指定为配置位置)。