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

本文详细介绍了Spring框架中的ApplicationContext,包括其作为IoC容器的角色、功能特性如Bean管理、依赖注入、AOP支持等,以及SpringBoot中启动过程中的关键步骤,如创建ApplicationContext、配置环境和执行监听器等。
摘要由CSDN通过智能技术生成

一、简介

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 的过程。比较重要的几个步骤:

StopWatch stopWatch = new StopWatch();
   stopWatch.start();

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

DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();

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

SpringApplicationRunListeners listeners = this.getRunListeners(args); listeners.starting(bootstrapContext, this.mainApplicationClass);

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

ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);

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

ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);

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

context = this.createApplicationContext();

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

this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);

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

this.refreshContext(context);

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

this.afterRefresh(context, applicationArguments);

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

四、加上注解后的源码

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

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值