【Spring】Spring框架中的一个核心接口ApplicationContext 简介,以及入口 Run() 的源码分析

一、简介

ApplicationContext 是Spring框架中的一个核心接口,它是Spring IoC容器的实现之一,用于管理和组织应用程序中的各种Bean,同时提供了一系列功能来支持依赖注入、AOP等特性。

简单来说,ApplicationContext 是一个大型的、高级的Spring IoC容器,它扩展了BeanFactory接口,提供了更多的功能和特性,比如事件传播、国际化支持、资源加载、生命周期回调等。

二、特性和功能

下面是ApplicationContext的一些重要特性和功能:

  1. Bean管理:ApplicationContext负责管理应用程序中的所有Bean,包括实例化、配置、装配和生命周期管理等。
  2. 依赖注入:通过ApplicationContext可以实现依赖注入(DI),即自动将依赖关系注入到相应的Bean中,避免硬编码依赖关系,提高代码的灵活性和可维护性。
  3. AOP支持:ApplicationContext提供了对面向切面编程(AOP)的支持,可以通过配置切面和通知来实现横切关注点的模块化和重用。
  4. 事件传播:ApplicationContext支持事件传播机制,可以在容器中发布和监听事件,实现模块之间的解耦和通信。
  5. 国际化支持:ApplicationContext提供了对国际化和本地化的支持,可以方便地处理多语言和不同地区的资源。
  6. 资源加载:ApplicationContext可以加载和管理各种类型的资源,包括文件、类路径资源、URL等,方便应用程序进行资源访问和管理。
  7. 生命周期管理:ApplicationContext管理Bean的生命周期,包括初始化、销毁等过程,可以通过配置来控制Bean的生命周期行为。
  8. 容器扩展:ApplicationContext是一个可扩展的容器,可以通过自定义扩展点来增加和定制容器的功能和行为。

ApplicationContext 是Spring框架中最重要的组件之一,它提供了一个全面的、集成的环境,帮助开发者管理和组织应用程序中的各种组件,并提供了丰富的功能来支持应用程序的开发和运行。

三、源码分析

这段代码是Spring Boot中 SpringApplication 类的 run方法的部分代码,主要是用于启动Spring Boot应用程序并创建 ApplicationContext 的过程。比较重要的几个步骤:

java 复制代码
StopWatch stopWatch = new StopWatch();
   stopWatch.start();

创建一个计时器,用于计算整个启动过程的时间。

java 复制代码
DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();

创建一个默认的引导上下文对象,用于启动过程中的一些操作。

java 复制代码
SpringApplicationRunListeners listeners = this.getRunListeners(args); listeners.starting(bootstrapContext, this.mainApplicationClass);

获取应用程序的运行监听器,并在启动前通知这些监听器应用程序即将启动。

java 复制代码
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

创建应用程序参数对象,用于传递命令行参数。

java 复制代码
ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);

准备应用程序的环境,包括配置文件的加载、属性的解析等操作。

java 复制代码
context = this.createApplicationContext();

创建应用程序的上下文,即ApplicationContext对象。

java 复制代码
this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);

准备应用程序的上下文,包括设置资源加载器、注册Bean后处理器等操作。

java 复制代码
this.refreshContext(context);

刷新应用程序的上下文,启动容器并加载Bean。

java 复制代码
this.afterRefresh(context, applicationArguments);

刷新后的处理,包括注册shutdown hook等操作。

四、加上注解后的源码

java 复制代码
// 启动Spring Boot应用程序并返回ApplicationContext对象
public ConfigurableApplicationContext run(String... args) {
    StopWatch stopWatch = new StopWatch(); // 创建计时器
    stopWatch.start(); // 开始计时

    DefaultBootstrapContext bootstrapContext = this.createBootstrapContext(); // 创建默认的引导上下文
    ConfigurableApplicationContext context = null; // 初始化ApplicationContext对象

    this.configureHeadlessProperty(); // 配置系统属性

    SpringApplicationRunListeners listeners = this.getRunListeners(args); // 获取运行监听器
    listeners.starting(bootstrapContext, this.mainApplicationClass); // 通知监听器应用程序即将启动

    try {
        ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); // 创建应用程序参数对象
        ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments); // 准备应用程序环境
        this.configureIgnoreBeanInfo(environment); // 配置忽略Bean信息
        Banner printedBanner = this.printBanner(environment); // 打印Banner

        context = this.createApplicationContext(); // 创建ApplicationContext对象
        context.setApplicationStartup(this.applicationStartup); // 设置应用程序启动方式

        this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner); // 准备应用程序上下文
        this.refreshContext(context); // 刷新应用程序上下文

        this.afterRefresh(context, applicationArguments); // 刷新后的处理

        stopWatch.stop(); // 停止计时器
        if (this.logStartupInfo) {
            (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch); // 记录启动信息
        }

        listeners.started(context); // 通知监听器应用程序已经启动
        this.callRunners(context, applicationArguments); // 执行命令行Runner任务
    } catch (Throwable var10) {
        this.handleRunFailure(context, var10, listeners); // 处理运行失败
        throw new IllegalStateException(var10); // 抛出异常信息
    }

    try {
        listeners.running(context); // 通知监听器应用程序正在运行
        return context; // 返回ApplicationContext对象
    } catch (Throwable var9) {
        this.handleRunFailure(context, var9, (SpringApplicationRunListeners)null); // 处理运行失败
        throw new IllegalStateException(var9); // 抛出异常信息
    }
}

这段代码是Spring Boot应用程序的启动过程中的核心代码,涉及了配置环境、加载Bean、执行监听器、打印Banner、记录启动信息等一系列操作,最终返回一个配置完成的ApplicationContext对象用于后续应用程序的运行。

相关推荐
bug菌¹几秒前
滚雪球学Oracle[2.5讲]:数据库初始化配置
数据库·oracle·数据库初始化·初始化配置
一休哥助手8 分钟前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
救救孩子把9 分钟前
深入理解 Java 对象的内存布局
java
落落落sss11 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
翔云12345616 分钟前
MVCC(多版本并发控制)
数据库·mysql
万物皆字节17 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭23 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由30 分钟前
速成java记录(上)
java·速成
代码敲上天.32 分钟前
数据库语句优化
android·数据库·adb
一直学习永不止步36 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序