美文网首页我爱编程
Spring - ApplicationContext类架构截图

Spring - ApplicationContext类架构截图

作者: 爱蛇 | 来源:发表于2018-03-31 06:21 被阅读0次

整体的架构

ApplicationContext类架构图

核心接口

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

AA.png

ApplicatonContext接口

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

ConfigurableApplicationContext接口(扩展了ApplicationContext接口)

ConfigurableApplicationContext接口

这个接口主要定义了

//用于刷新容器的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接口)

WebApplicationContext接口

ConfigurableWebApplicationContext接口

ConfigurableWebApplicationContext接口

核心实现类

简化图.png

先看三个基础抽象类

AbstractApplicationContext 
  + AbstractRefreshableApplicationContext    
     + AbstractRefreshableConfigApplicationContext

AbstractApplicationContext抽象类

AbstractApplicationContext.png

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抽象类

AbstractRefreshableApplicationContext.png

AbstractRefreshableConfigApplicationContext抽象类

AbstractRefreshableConfigApplicationContext.png

AbstractRefreshableConfigApplicationContext类分支

AbstractRefreshableConfigApplicationContext分支.png

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

AbstractXmlApplicationContext类

AbstractXmlApplicationContext.png

AbstractRefreshableWebApplicationContext类

AbstractRefreshableWebApplicationContext.png

相关文章

网友评论

    本文标题:Spring - ApplicationContext类架构截图

    本文链接:https://www.haomeiwen.com/subject/kknwcftx.html