【Spring】ApplicationContext 一 接口梳理
前言
我们通常所说的 Spring IoC Container
,它落地的 API
体现往大了说就是 BeanFactory
,再具体点其实就是 ApplicationContext
:
BeanFactory
更专注于bean
实例及其生命周期的相关管理ApplicationContext
在BeanFactory
的基础上又拓展了一些容器级别的能力比如国际化(i18n)
事件机制
等
版本
Spring 5.3.x
ApplicationContext
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
// 容器id
@Nullable
String getId();
// 容器name
String getApplicationName();
// 容器别名
String getDisplayName();
// 容器启动时间戳
long getStartupDate();
// 父容器
@Nullable
ApplicationContext getParent();
/**
* 以 AutowireCapableBeanFactory 返回底层维护的 BeanFactory
*/
AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}
可以从 ApplicationContext
实现的接口大致分析它的能力:
EnvironmentCapable
,它是可以持有Environment
并与其互动的ListableBeanFactory
,它作为基于BeanFactory
的拓展,把bean
实例相关的功能委托给BeanFactory
,一些不常用的比如AutowireCapableBeanFactory
的能力,则需要我们getAutowireCapableBeanFactory
后进一步使用HierarchicalBeanFactory
,层级概念MessageSource
,国际化ApplicationEventPublisher
,事件机制ResourcePatternResolver
,资源访问
ConfigurableApplicationContext
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {
// ...常量定义
void setId(String id);
void setParent(@Nullable ApplicationContext parent);
// 此处返回的是 ConfigurableEnvironment,可以“写”
void setEnvironment(ConfigurableEnvironment environment);
@Override
ConfigurableEnvironment getEnvironment();
// ApplicationStartup
void setApplicationStartup(ApplicationStartup applicationStartup);
ApplicationStartup getApplicationStartup();
// 注册 BeanFactoryPostProcessor
void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);
// 注册监听器
void addApplicationListener(ApplicationListener<?> listener);
void setClassLoader(ClassLoader classLoader);
void addProtocolResolver(ProtocolResolver resolver);
// 核心方法:加载|刷新 整个容器
void refresh() throws BeansException, IllegalStateException;
// 注册销毁钩子(最多注册一个)
void registerShutdownHook();
// 容器关闭
@Override
void close();
// 容器是否存活(已 refresh 而未 close)
boolean isActive();
/**
* BeanFactory 获取,此处获取到的是已经完成 refresh 的
* BeanFactory,因此不能拿来进行"写"操作,对 BeanFactory
* 的后处理通过注册 BeanFactoryPostProcessor 实现
*/
ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;
}
“可配置”的 ApplicationContext
,概括如下:
- 这是
Spring
常用的设计模式:顶层接口提供读
能力,子接口ConfigurableXXX
提供写
能力,这里包括对BeanFactory
相关组件的配置 - 可以获取
ConfigurableEnvironment
来干涉配置环境信息,这是一个重要的拓展点 - 核心方法
refresh
,后续会重点解读
WebApplicationContext
public interface WebApplicationContext extends ApplicationContext {
/**
* Web 根容器会绑定在 ServletContext 的这个属性上
* 我们可以通过 WebApplicationContextUtils 工具类获取
*/
String ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE = WebApplicationContext.class.getName() + ".ROOT";
/**
* web 环境默认注册的三个 Scope
*/
String SCOPE_REQUEST = "request";
String SCOPE_SESSION = "session";
String SCOPE_APPLICATION = "application";
/**
* 一些 web 环境的 beanName 常量
*/
String SERVLET_CONTEXT_BEAN_NAME = "servletContext";
String CONTEXT_PARAMETERS_BEAN_NAME = "contextParameters";
String CONTEXT_ATTRIBUTES_BEAN_NAME = "contextAttributes";
/**
* Web 的 ServletContext 实例
*/
@Nullable
ServletContext getServletContext();
}
- 这是
Web 容器
的顶层接口 - 它持有
ServletContext
实例,同时ServletContext
也维护着根容器的对应属性 - 子类
ConfigurableWebApplicationContext
,提供web
环境相关的可配置方法
总结
自顶向下的从接口入手了解 ApplicationContext
,下一章节再从抽象基类的核心方法进一步了解