整体的架构

核心接口
ApplicatonContext接口下分两了分支,分别是
ConfigurableApplicationContext 和 WebApplicationContext
然后还有一个ConfigurableWebApplicationContext同时扩展了上面两个接口。

ApplicatonContext接口

主要定义了一些简单基础属性信息,例如Id,名称,父级容器等等。
String getId();
String getApplicationName();
String getDisplayName();
long getStartupDate();
ApplicationContext getParent();
ConfigurableApplicationContext接口(扩展了ApplicationContext接口)

这个接口主要定义了
//用于刷新容器的refresh方法, 注意只能调用一次,调用多次会抛出异常
void refresh() throws BeansException, IllegalStateException;
//用于监听容器事件的addApplicationListener方法
void addApplicationListener(ApplicationListener<?> listener);
//用于获取和设置配置环境的 get/setEnviroment方法
void setEnvironment(ConfigurableEnvironment environment);
@Override
ConfigurableEnvironment getEnvironment();
比较重要的一个方法, refresh方法,用于加载bean,但只能调用一次或者说初始化之后就不能调用,正如方法抛出的异常
void refresh() throws BeansException, IllegalStateException;
IllegalStateException - if already initialized and multiple refresh attempts are not supported
WebApplicationContext接口(扩展了ApplicationContext接口)

ConfigurableWebApplicationContext接口

核心实现类

先看三个基础抽象类
AbstractApplicationContext
+ AbstractRefreshableApplicationContext
+ AbstractRefreshableConfigApplicationContext
AbstractApplicationContext抽象类

AbstractApplicationContext已经实现了大部分核心功能,
本质是一个DefaultResouceLoader,实现ConfigurableApplicationContext接口。
实现了refresh 方法、addApplicationContextListener方法
另外还包含了注册JVM钩子函数,用于监听jvm线程结束时关闭ApplicationContext,从而销毁ioc容器里的所有bean对象
//实现了AutoCloseable接口
@Override
public void close() {
synchronized (this.startupShutdownMonitor) {
doClose();
// If we registered a JVM shutdown hook, we don't need it anymore now:
// We've already explicitly closed the context.
if (this.shutdownHook != null) {
try {
Runtime.getRuntime().removeShutdownHook(this.shutdownHook);
}
catch (IllegalStateException ex) {
// ignore - VM is already shutting down
}
}
}
@Override
public void registerShutdownHook() {
if (this.shutdownHook == null) {
// No shutdown hook registered yet.
this.shutdownHook = new Thread() {
@Override
public void run() {
synchronized (startupShutdownMonitor) {
doClose();
}
}
};
Runtime.getRuntime().addShutdownHook(this.shutdownHook);
}
}
AbstractRefreshableApplicationContext抽象类

AbstractRefreshableConfigApplicationContext抽象类

AbstractRefreshableConfigApplicationContext类分支

从图中可以看出从 AbstractRefreshableConfigApplicationContext类开始分两个分支的子类,分别是
AbstractXmlApplicationContext 和 AbstractRefreableWebApplicationContext
AbstractXmlApplicationContext类

AbstractRefreshableWebApplicationContext类

网友评论