【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对象用于后续应用程序的运行。

相关推荐
kura_tsuki5 小时前
[Oracle数据库] Oracle 常用函数
数据库·oracle
YA3336 小时前
java基础(十)sql的mvcc
数据库
呼啦啦啦啦啦啦啦啦7 小时前
常见的排序算法
java·算法·排序算法
anlogic7 小时前
Java基础 8.18
java·开发语言
练习时长一年8 小时前
AopAutoConfiguration源码阅读
java·spring boot·intellij-idea
源码宝9 小时前
【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
java·大数据·spring cloud·数据分析·源码·智慧工地·云平台
weixin_3077791310 小时前
VS Code配置MinGW64编译SQLite3库
开发语言·数据库·c++·vscode·算法
David爱编程10 小时前
面试必问!线程生命周期与状态转换详解
java·后端
J_bean10 小时前
Spring AI Alibaba 项目接入兼容 OpenAI API 的大模型
人工智能·spring·大模型·openai·spring ai·ai alibaba
SelectDB10 小时前
Apache Doris 4.0 AI 能力揭秘(一):AI 函数之 LLM 函数介绍
数据库·人工智能·数据分析