【Spring】ApplicationContext 一 接口梳理

前言

我们通常所说的 Spring IoC Container,它落地的 API 体现往大了说就是 BeanFactory,再具体点其实就是 ApplicationContext

  • BeanFactory 更专注于 bean 实例及其生命周期的相关管理
  • ApplicationContextBeanFactory 的基础上又拓展了一些容器级别的能力比如 国际化(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,下一章节再从抽象基类的核心方法进一步了解

下一篇:【Spring】ApplicationContext 二 AbstractApplicationContext

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值