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

相关推荐
Code哈哈笑5 分钟前
【JavaEE】SpringBoot快速上手,探秘 Spring Boot,搭建 Java 项目的智慧脚手架
java·spring boot·java-ee
Seven9712 分钟前
【设计模式】从火车站卖票看代理模式的实际应用
java·后端·设计模式
A阳俊yi24 分钟前
SpringMVC概述以及入门案例
java·spring
开开心心就好38 分钟前
能一站式搞定远程操作需求的实用工具
java·服务器·python·spring·pdf·电脑·软件
冬天vs不冷43 分钟前
Spring组件实例化扩展点:InstantiationAwareBeanPostProcessor
java·后端·spring
morris13143 分钟前
【redis】事务
数据库·redis·缓存·pipeline·lua·事务
上官美丽1 小时前
Maven Deploy Plugin如何使用?
java·maven
Ase5gqe1 小时前
Spring Boot HikariCP数据库连接池入门
java
梅茜Mercy1 小时前
C++:入门详解(关于C与C++基本差别)
java·c语言·c++
功德+n1 小时前
Apache POI详解
java·开发语言·maven·apache