(Spring学习08)Spring之容器配置类解析过程源码解析

解析配置类

解析配置类流程图:https://www.processon.com/view/link/5f9512d5e401fd06fda0b2dd
解析配置类思维脑图:https://www.processon.com/view/link/614c83cae0b34d7b342f6d14

  1. 在启动Spring时,需要传入一个AppConfig.class给ApplicationContext,ApplicationContext会根据AppConfig类封装为一个BeanDefinition,这种BeanDefinition我们把它称为配置类BeanDefinition。
  2. ConfigurationClassPostProcessor中会把配置类BeanDefinition取出来
  3. 构造一个ConfigurationClassParser用来解析配置类BeanDefinition,并且会生成一个配置类对象ConfigurationClass
  4. 如果配置类上存在@Component注解,那么解析配置类中的内部类(这里有递归,如果内部类也是配置类的话)
  5. 如果配置类上存在@PropertySource注解,那么则解析该注解,并得到PropertySource对象,并添加到environment中去
  6. 如果配置类上存在@ComponentScan注解,那么则解析该注解,进行扫描,扫描得到一系列的BeanDefinition对象,然后判断这些BeanDefinition是不是也是配置类BeanDefinition(只要存在@Component注解就是配置类,所以基本上扫描出来的都是配置类),如果是则继续解析该配置类,(也有递归),并且会生成对应的ConfigurationClass
  7. 如果配置类上存在@Import注解,那么则判断Import的类的类型:
    i. 如果是ImportSelector,那么调用执行selectImports方法得到类名,然后在把这个类当做配置类进行解析**(也是递归)**
    ii. 如果是ImportBeanDefinitionRegistrar,那么则生成一个ImportBeanDefinitionRegistrar实例对象,并添加到配置类对象中(ConfigurationClass)的importBeanDefinitionRegistrars属性中。
  8. 如果配置类上存在@ImportResource注解,那么则把导入进来的资源路径存在配置类对象中的importedResources属性中。
  9. 如果配置类中存在@Bean的方法,那么则把这些方法封装为BeanMethod对象,并添加到配置类对象中的beanMethods属性中。
  10. 如果配置类实现了某些接口,则看这些接口内是否定义了@Bean的默认方法
  11. 如果配置类有父类,则把父类当做配置类进行解析
  12. AppConfig这个配置类会对应一个ConfigurationClass,同时在解析的过程中也会生成另外的一些ConfigurationClass,接下来就利用reader来进一步解析ConfigurationClass
    i. 如果ConfigurationClass是通过@Import注解导入进来的,则把这个类生成一个BeanDefinition,同时解析这个类上@Scope,@Lazy等注解信息,并注册BeanDefinition
    ii. 如果ConfigurationClass中存在一些BeanMethod,也就是定义了一些@Bean,那么则解析这些@Bean,并生成对应的BeanDefinition,并注册
    iii. 如果ConfigurationClass中导入了一些资源文件,比如xx.xml,那么则解析这些xx.xml文件,得到并注册BeanDefinition
    iv. 如果ConfigurationClass中导入了一些ImportBeanDefinitionRegistrar,那么则执行对应的registerBeanDefinitions进行BeanDefinition的注册

总结一下

  1. 解析AppConfig类,生成对应的ConfigurationClass
  2. 再扫描,扫描到的类都会生成对应的BeanDefinition,并且同时这些类也是ConfigurationClass
  3. 再解析ConfigurationClass的其他信息,比如@ImportResource注解的处理,@Import注解的
    处理,@Bean注解的处理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于C++的简单BP神经网络(C++)

需求:在某些无网络的实验机器上,由于某些任务需求,需要拟合特定的函数,因此需要部署基于C开发的神经网络,本文在不使用外部库的情况下,编写简单的神经网络,实现简单函数的拟合。 一、简介 本文…

我常用的几个经典Python模块

Python常用的模块非常多,主要分为内置模块和第三方模块两大类,且不同模块应用场景不同又可以分为文本类、数据结构类、数学运算类、文件系统类、爬虫类、网络通讯类等多个类型。 大家常用的内置模块比如:math、re、datetime、urllib、os、ra…

CountDownLatch用法、详解

目录 ​编辑 概述: 应用场景: 优点: 缺点: 主要方法: 1. CountDownLatch(int count): 2. void await(): 3. boolean await(long timeout, TimeUnit unit): 4. void countDo…

【Python】计算一年内的总天数(还有跨年日期)

花了一段时间才找到Python中求一年中总日数(total day of the Year)的格式代码,所以也把计算方法记录下来。 基本 首先,简单地找出一年中的总天数, strftime() 和 strptime() 的格式代码是 %j ↓看这里 使用 strft…

基于当前实时云渲染的特点,用户体验主要受哪些因素影响?

在回答这个问题之前我们首先需要理解什么是实时云渲染? 点量实时云渲染是一种基于云计算低延迟传输,实现各种轻终端便捷使用云端大型软件和3D应用的一种云技术解决方案。这一技术解决方案通过将应用程序或内容置于云端服务器上运行,然后以视…

测试用例设计方法六脉神剑——第四剑:石破天惊,功能图法攻阵

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法,主要是针对于不同条件输入输出的组合进行测试,但在实际需求中,我们也常会遇到需要对被测对象的状态流转进行验证的情况,此时前面几种方法将不再适用&#xf…

测试用例设计方法:功能图

1 引言 前面几篇文章为我们讲述了因果图、判定表、正交试验等几种方法,主要是针对于不同条件输入输出的组合进行测试,但在实际需求中,我们也常会遇到需要对被测对象的状态流转进行验证的情况,此时前面几种方法将不再适用&#xf…

OpenHarmony 鸿蒙系统之开发环境安装

一、首先在下方链接网址中下载DevEco Studio的安装包。 DevEco Studio历史版本下载-HarmonyOS应用开发官网

Linux CentOS7 Docker安装Jenkins

1 sudo yum update #确保yum包更新到最新 service network restart #重启网络 2、查询镜像 docker search jenkins 3、拉取镜像 docker pull jenkins/jenkins #拉取镜像 4、创建Jenkins工作目录,并将容器内目录挂载到此目录…

23.12.10日总结

周总结 这周三的晚自习,学姐讲了一下git的合作开发,还有懒加载,防抖,节流 答辩的时候问了几个问题: 为什么在js中0.10.2!0.3? 在js中进行属性运算时,会出现0.10.20.300000000000000004js遵循IEEE754标…

CSS伪元素的特殊机制

概念 伪元素是CSS中的一种特殊机制,用于在元素的特定位置插入虚拟的内容。它们不是实际存在于HTML文档中的元素,而是通过CSS样式来创建和控制的。 伪元素使用双冒号(::)作为标识符,用于区分伪类选择器(使…

Linux Shell——基本语法(变量、流程控制)

shell基本语法 一、变量二、流程控制 总结 最近学习了shell脚本,记录一下相关语法 一、变量 变量是很重要的,是用于存储数据值的容器 变量名要遵循以下规则: (1)只能包含字母、数字和下划线 (2&#xff09…

鸿蒙开发组件之Web

一、加载一个url myWebController: WebviewController new webview.WebviewControllerbuild() {Column() {Web({src: https://www.baidu.com,controller: this.myWebController})}.width(100%).height(100%)} 二、注意点 2.1 不能用Previewer预览 Web这个组件不能使用预览…

Android camera的metadata

一、实现 先看一下metadata内部是什么样子: 可以看出,metadata 内部是一块连续的内存空间。 其内存分布大致可概括为: 区域一 :存 camera_metadata_t 结构体定义,占用内存 96 Byte 区域二 :保留区&#x…

Linux install manual 1Panel

前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…

Qt图像处理-Qt中配置OpenCV打开本地图片

本文讲解Qt中配置OpenCV过程并用实例展示如何使用OpenCV打开图片(windows环境下) 一、下载OpenCv 本文使用版本OpenCV-MinGW-Build-OpenCV-3.4.5 下载地址: https://codeload.github.com/huihut/OpenCV-MinGW-Build/zip/refs/heads/OpenCV-3.4.5 点击Code-local-Downlo…

大模型的实践应用13-量化后的通义千问Qwen的18亿参数在CPU上的部署,最小2GB显存可跑,并利用两种文本流式方式输出

大家好,我是微学AI,今天给大家介绍大模型的实践应用13-量化后的通义千问Qwen的18亿参数在CPU上的部署,最小2GB显存可跑,并利用两种文本流式方式输出。Qwen-1_8B-Chat是阿里云研发的通义千问大模型系列的18亿参数规模的模型。Qwen-1.8B是基于Transformer的大语言模型, 在超大…

LabVIEW进行癌症预测模型研究

LabVIEW进行癌症预测模型研究 癌症是一种细胞异常增生的疾病。随着年龄的增长,细胞分裂速度放缓,但癌细胞会失去控制地不断分裂,形成可能良性或恶性的肿瘤。 2012年的国际癌症数据显示,新发癌症病例和癌症相关死亡人数有所增加。…

.NET 开发人员,迎接高薪的挑战,你准备好了吗?

我发现我对编程的热情深深植根于我对逻辑的偏好。加入CSDN,标志着进入 .NET 开发人员世界的激动人心的旅程的开始。下面我与您分享我的故事。 编程之路 我大学是主修通信计算机创新,各种各样的选修课程,从平面设计、UX/UI 设计、数字营销到电影&#x…

在Node.js中MongoDB删除数据的方法

本文主要介绍在Node.js中MongoDB删除数据的方法。 目录 Node.js中MongoDB删除数据使用mongodb库删除数据使用Mongoose库删除数据 Node.js中MongoDB删除数据 在Node.js中,可以使用mongodb和Mongoose库来连接和操作MongoDB数据库。 下面是分别使用这两个库在MongoDB中…
最新文章