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

news2024/11/24 10:55:03

一、简介

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1546039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESCTF-OSINT赛题WP

这你做不出来?check ESCTF{湖北大学_嘉会园食堂} 这个识图可以发现是 淡水渔人码头 但是 osint 你要发现所有信息 聊天记录说国外 同时 提示给了美国 你综合搜索 美国 渔人码头 在美国旧金山的渔人码头(英语:Fisherman’s Wharf)是一个著名旅…

canvas跟随鼠标画有透明度的矩形边框

提示&#xff1a;canvas跟随鼠标画有透明度的矩形边框 文章目录 前言一、跟随鼠标画有透明度的矩形边框总结 前言 一、跟随鼠标画有透明度的矩形边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

文件包含漏洞及防御

一&#xff0c;什么是文件包含漏洞 文件包含包括&#xff1a; 内容包含函数包含 优点&#xff1a;减少代码量&#xff1b;易于维护&#xff1b; 出现的问题&#xff1a; 可能会导致允许访问敏感文件或者执行恶意代 码&#xff0c;造成漏洞&#xff1b;这就被称为文件包含漏…

OceanBase实践分享:如何用ODC进行历史数据归档,提升性能

作者&#xff1a;洪波&#xff0c;数据库爱好者 最新版 V4.2.2 已上线&#xff0c;其新增的数据生命周期管理功能颇具吸引力。据官方资料显示&#xff0c;ODC现支持将源数据库中的表数据&#xff0c;无论是单次还是周期性地&#xff0c;归档至其它目标数据库。这一设计旨在解决…

R折线图(自备)

目录 折线图基础 创建散点和折线图 复杂折现加图例 折线图柱状图 数据处理 进行差异检验 基础绘图折线 基础绘图箱线 进行合并 双轴柱状与折线图 数据 折线图基础 创建散点和折线图 rm(list ls()) opar <-par(no.readonlyTRUE)##自带orange数据集 par(mfrowc…

【C++】基础:STL容器库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍STL容器库。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#x1f95…

【Java程序设计】【C00370】基于(JavaWeb)Springboot的公司进存销管理系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…

linux-开发板移植MQTT

将源码复制到共享文件夹 链接&#xff1a;https://pan.baidu.com/s/1kvvO-HhDMDXkQ_wlNtyW_A?pwd332i 提取码&#xff1a;332i 以下步骤教程里都写了&#xff0c;我这里边进行&#xff0c;方便大家对照 pc端 1.进入mqtt_lib, 解压open压缩包 2.按照教程复制这一句并运行&…

稀碎从零算法笔记Day25-LeetCode:数组中的第K个最大元素

题型&#xff1a;排序、堆 链接&#xff1a;215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。&#xff08;降序排列后的第K个元素&#xff0…

蓝桥杯算法 - DP

上一篇&#xff1a;[[蓝桥杯算法-排序、递归、全排列]] 动态规划&#xff08;dp&#xff09; dp即动态规划&#xff0c;常用于&#xff1a;数学&#xff0c;计算机科学&#xff0c;管理学&#xff0c;经济和生物信息学。 dp在生活中也很常见&#xff0c;如&#xff1a;你今天…

vue前端标准

此文档的目的是让前端和产品、服务端开发&#xff0c;相互之间形成一种默契。 比如一些通用设计&#xff0c;不需要产品去说明&#xff0c;我们默认怎么做。 以及&#xff0c;我们开发之间的默契。 期盼大家的补充 开发原则&#xff1a; 感谢各位开发大佬共建原则&#xf…

STM32 ESP8266模块的曲折探索

这是本文的配套资料&#xff0c;最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s&#xff0c;以下为产品规格书 引脚定义&#xff1a; 依据引脚定义&…

docker安装redis 6.2.7 并 远程连接

阿里云ecs服务器&#xff0c;docker安装redis 6.2.7 并 远程连接 文章目录 阿里云ecs服务器&#xff0c;docker安装redis 6.2.7 并 远程连接1. 拉取redis镜像2. 查看是否下载成功3. 挂载配置文件4. 下载reids配置文件(redis.conf)5. docker创建redis容器6. 查看redis容器运行状…

JL-34 超声波气象站 可集成多要素 集成度高、颜值高、免安装、免布线

产品概述 超声波气象站是我公司结合多年气象产品开发经验&#xff0c;根据现场实际情况开发的一款多功能自动气象站。该产品集温度、湿度、气压、风速、风向、雨量、大气压力、颗粒物和噪声等要素为一体&#xff0c;该系列产品集成度高、颜值高、免安装、免布线。 功能特点 …

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…

54、Qt/对话框、事件机制相关学习20240325

一、完善对话框&#xff0c;点击登录按钮&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#…

android h5理财(记账)管理系统eclipse开发mysql数据库编程服务端java计算机程序设计

一、源码特点 android h5理财管理系统是一套完善的WEBandroid设计系统&#xff0c;对理解JSP java&#xff0c;安卓app编程开发语言有帮助&#xff08;系统采用web服务端APP端 综合模式进行设计开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…

TCP与UDP:传输层协议对比

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

VMware中添加使用ubuntu

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教。 文章目录 前言一、ubuntu安装二、下载vmwareTool三、解压文件四、解决联网失败五、linux常用命令总结 前言 打破舒适圈 一、ubuntu安装 Vmware安装流程 二、下载vmwareToo…

编程语言|C语言——C语言实现玫瑰花(情人节)

1.说明 在古希腊神话中&#xff0c;玫瑰花集爱与美于一身&#xff0c;既是美神的化身&#xff0c;又溶进了爱神的血液&#xff0c;所以它所代表的含义是爱情。 我们应该用玫瑰花来表达我们的爱意&#xff0c;但是好多的恋人都是因为异地而没有办法去买一束新鲜的玫瑰去送给自己…