Spring之配置类解析源码解析

news2024/11/14 17:49:38

解析配置类

解析配置类流程图: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的类的类型:
    1. 如果是ImportSelector,那么调用执行selectImports方法得到类名,然后在把这个类当做配置类进行解析**(也是递归)**
    2. 如果是ImportBeanDefinitionRegistrar,那么则生成一个ImportBeanDefinitionRegistrar实例对象,并添加到配置类对象中(ConfigurationClass)的importBeanDefinitionRegistrars属性中。
  8. 如果配置类上存在@ImportResource注解,那么则把导入进来的资源路径存在配置类对象中的importedResources属性中。
  9. 如果配置类中存在@Bean的方法,那么则把这些方法封装为BeanMethod对象,并添加到配置类对象中的beanMethods属性中。
  10. 如果配置类实现了某些接口,则看这些接口内是否定义了@Bean的默认方法
  11. 如果配置类有父类,则把父类当做配置类进行解析
  12. AppConfig这个配置类会对应一个ConfigurationClass,同时在解析的过程中也会生成另外的一些ConfigurationClass,接下来就利用reader来进一步解析ConfigurationClass
    1. 如果ConfigurationClass是通过@Import注解导入进来的,则把这个类生成一个BeanDefinition,同时解析这个类上@Scope,@Lazy等注解信息,并注册BeanDefinition
    2. 如果ConfigurationClass中存在一些BeanMethod,也就是定义了一些@Bean,那么则解析这些@Bean,并生成对应的BeanDefinition,并注册
    3. 如果ConfigurationClass中导入了一些资源文件,比如xx.xml,那么则解析这些xx.xml文件,得到并注册BeanDefinition
    4. 如果ConfigurationClass中导入了一些ImportBeanDefinitionRegistrar,那么则执行对应的registerBeanDefinitions进行BeanDefinition的注册

总结一下

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

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

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

相关文章

VMware安装Ubuntu Linux Server操作系统

本文主要描述在VMware虚拟机上安装Ubuntu Linux Server操作系统,本版本集成kubernetes云原生对应的microk8s组件。 如上所示,从Ubuntu官方网站上下载Ubuntu服务器版本的安装文件 如上所示,在VMware上新建虚拟机,指定已下载的Ubunt…

基于yolov5的明厨亮灶阳光厨房老鼠检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的明厨亮灶阳光厨房老鼠检测系统是一种高效、智能的食品安全监测解决方案。该系统利用YOLOv5网络模型,结合深度学习技术,实现对厨房环境的实时监控与智能分析。 YOLOv5以其高速和高精度的特性,在实时目标检测任务中…

chapter09-OOP高级部分——(内部类)——day13

413-四种内部类 414-局部内部类1 记住: (1)局部内部类定义在方法中/代码块(2)作用域在方法体或者代码块中(3)本质仍然是一个类 415-局部内部类2 416-匿名内部类本质 匿名内部类只能用一次,并实例化了一个tiger对象, tiger指向它的对象,tig…

18043 找出3个数中最大的数

### 思路 1. 从键盘输入三个整数&#xff0c;使用空格分隔。 2. 比较三个整数&#xff0c;找出其中最大的数。 3. 输出最大的数。 ### 伪代码 1. 读取输入的三个整数。 2. 比较三个整数&#xff0c;找出最大的数。 3. 输出最大的数。 ### C代码 #include <iostream>…

Python编码系列—Python调试秘籍:pdb调试工具的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

《神话:悟空》的破晓之路:文化深度与技术巅峰的交响乐章

在八月的炽热中&#xff0c;《黑神话&#xff1a;悟空》如同一道璀璨的光芒&#xff0c;划破了国产游戏的寂静夜空&#xff0c;不仅以其惊人的销量速度震撼了业界&#xff0c;更以其深厚的文化底蕴与顶尖的游戏设计&#xff0c;在全球玩家心中留下了不可磨灭的印记。这款游戏的…

Masonry的入门学习

Masonry的学习 文章目录 Masonry的学习前言使用MasonryMasonry支持的属性修饰语基础APIAuto Boxing中心点设置边距优先级创建约束更新约束使用Masonry来布局UIScrollview 小结 前言 在日常的开发中&#xff0c;我们如果面对一些很复杂的UI布局&#xff0c;我们如果统一使用fram…

并发编程之AtomicUnsafe魔法类详解

并发编程之Atomic&Unsafe魔法类详解_并发魔法类-CSDN博客

京东2025校招/社招内推信息

社招链接&#xff1a;https://zhaopin.jd.com/web/job/job_info_list/3 社招内推码&#xff1a;JC8DI 校招链接&#xff1a;https://campus.jd.com/home#/ 校招内推码&#xff1a;C49D1 有需要的同学也可私信我姓名、电话、邮箱内推已经投递的同学可私信我获取最新进展哦

国内访问GitHub很卡,steam连接断开怎么办

目录 第一章、问题分析1.1&#xff09;问题1.2&#xff09;解决&#xff1a;下载个加速器就好了 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、问题分析 1.1&#xff09;问题 国内访问GitHub很卡怎…

Docker容器技术详解

一、Docker简介及部署方法 1.1Docker简介 1.1.1什么是docker Docker是管理容器的引擎&#xff0c;为应用打包、部署平台&#xff0c;而非单纯的虚拟化技术 docker的重要特点和优势&#xff1a; 1. 轻量级虚拟化Docker 容器相较于传统的虚拟机更加轻量和高效&#xff0c;能够…

基于langchain的多轮对话RAG

目录 概述 整体架构 代码实现 输出展示 参考 概述 相比于单轮对话&#xff0c;多轮对话要考虑历史对话记录&#xff0c;大模型需要根据对话上下文去回答用户的问题。在RAG的场景中&#xff0c;通常需要通过问题去召回和问题相关的知识&#xff0c;再将知识和问题交给大模型…

江大白 | 大模型时代,CV目标检测任务,会走向何方?

本文来源公众号“江大白”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;大模型时代&#xff0c;CV目标检测任务&#xff0c;会走向何方&#xff1f; 以下文章来源于知乎&#xff1a;深度眸 作者&#xff1a;深度眸 编辑&#…

华为手机永久关闭自动亮度 | 使用智慧场景

问题 使用华为手机时&#xff0c;无法在设置中永久性关闭自动亮度&#xff0c;因为每次手机重启后都会自动打开自动亮度。此问题目前无法通过设置去解决&#xff0c;但可以通过华为的智慧场景解决&#xff0c;下文介绍解决方案。 解决方案 智慧场景 打开智慧生活APP&#xf…

JavaScript 作用链

JavaScript 作用链是指在 JavaScript 中查找变量时所遵循的规则和路径。它描述了当前执行上下文及其父级上下文之间的关系。作用链用于解析变量&#xff0c;当在一个作用域中查找变量时&#xff0c;如果当前作用域中没有找到&#xff0c;则会沿着作用链向上查找&#xff0c;直到…

华为OD机试真题 - 查找充电设备组合 - 子集和问题(Java/Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Java/Python/JS/C/C++)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX…

51单片机——LED点阵屏

1、点阵屏简介 LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合&#xff0c;如汽车报站器、广告屏以及公告牌等 LED点阵屏分类 按颜色&#xff1a;单色、双色、全彩 …

多目标应用:基于SPEA2的移动机器人路径规划研究(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

【网络安全】命令执行漏洞—远程代码执行及远程系统命令

命令执行漏洞是指Web应用程序中由于对用户输入的验证不足&#xff0c;导致恶意用户能够构造并传递一些预期之外的命令给服务器&#xff0c;从而在服务器上执行任意命令。这种漏洞可能允许攻击者获取敏感信息、破坏服务、访问系统文件&#xff0c;甚至获得服务器的控制权。 一、…

minio文件存储+ckplayer视频播放(minio分片上传合并视频播放)

文章目录 参考简述效果启动minio代码配置类RedisConfigWebConfigMinioClientAutoConfigurationOSSPropertiesapplication.yml 实体类MinioObjectResultStatusCodeOssFileOssPolicy 工具类FileTypeUtilMd5UtilMediaTypeMinioTemplate 文件分片上传与合并MinioFileControllerMini…