源码深度剖析Spring Bean标签的解析及注册

news2024/9/20 20:28:43

在博客《一步一步带你深入源码看Spring是如何加载XML配置文件的》中把Spring对XML配置文件如何加载的说明白了,XML配置文件加载完成后就是对标签的解析,本篇博客就是针对Spring bean 标签的解析以及bean definition 的注册。

Spring 中的标签包括默认标签和自定义标签两种, 默认标签的解析是在DefaultBeanDefinitionDocumentReader.parseDefaultElement()方法中进行的, 此方法对4种不同的标签(import,alias,bean和beans)做了不同的处理,具体代码如下:
在这里插入图片描述
processBeanDefinition()方法是对默认的bean标签进行解析,具体代码如下:
在这里插入图片描述

解析逻辑是:

  1. 委托BeanDefinitionParserDelegate.parseBeanDefinitionElement()方法进行元素解析,返回BeanDefinitionHolder类型的实例bdHolder,bdHolder实例包含了配置文件中配置的各种属性,例如class,name,id,alias等属性.
  2. 当返回的bdHolder不为空的情况下若存在默认标签的子节点下还有自定义属性,则还需再次对自定义标签进行解析.
  3. 解析完成后,需要对解析后的bdHolder进行注册,注册操作委托给了BeanDefinitionReaderUtils.registerBeanDefinition()方法.
  4. 最后发出响应时间,通知相关的监视器,到此bean就已经加载完成.

parseBeanDefinitionElement()方法调用了重载方法对Spring bean标签进行了犹如剥洋葱似的层层解析.具体代码如下:
在这里插入图片描述
从代码中可以看出,解析流程分为4步:
第一步:先提取元素中的id以及name属性.
第二步: 进一步解析其他所有属性并统一封装到AbstractBeanDefinition类型的实例中.具体代码如下:
在这里插入图片描述

第三步: 如果检测到bean么有指定beanName,那么使用默认规则为此bean生产beanName;
第四步: 将获取到的信息封装到baanDefinitionHolder的实例中.
对各个标签的解析再次就不一样赘述了,感兴趣的可以自行查看源码.

当spring 中的bean 使用的是默认的标签配置,但是其中的子元素却使用了自定义的标签,例如

<bean id="test" class="test MyClass" >
	<mybean:user username="aaa"/>
</bean>

在这个是就是用DefaultBeanDefinitionDocumentReader.parseDefaultElement()方法中decorateBeanDefinitionIfRequired()方法解析默认标签中的自定义标签,具体代码如下:
在这里插入图片描述
decorateBeanDefinitionIfRequired()方法调用了重载方法,对元素的所有属性以及子节点进行遍历,代码如下:
在这里插入图片描述
从方法中可以看到decorateBeanDefinitionIfRequired()方法还调用了decorateIfRequired()方法获取属性或者元素的命名空间,以此来判断该元素或者属性是否使用于自定义标签的解析条件,找出自定义类型所对应的NamespaceHandler并进行进一步判断,具体代码如下:
在这里插入图片描述

到目前为止,配置文件已经完成了解析和装饰,接下来就需要对解析完成的Bean 进行注册,DefaultBeanDefinitionDocumentReader.parseDefaultElement()方法调用了BeanDefinitionReaderUtils.registerBeanDefinition()方法进行注册:
在这里插入图片描述
解析的bean 都会被注册到BeanDefinitionRegistry中,bean的注册分为两部分:通过beanName注册以及通过别名进行注册,代码如下:
在这里插入图片描述
通过beanName的方式注册bean的实现是DefaultListableBeanFactory.registerBeanDefinition(),主要是有以下四个步骤:
步骤一:对AbstractBeanDefinition的methodOverrides属性进行校验.
步骤二: 对beanName 已经注册的情况进行处理,如果设置了不允许bean的覆盖,则需要抛出异常,否则直接覆盖.
步骤三:加入map缓存
步骤四: 清除之前留下的对应的beanName的缓存.具体代码如下:
在这里插入图片描述
通过别名注册bean方法调用的是SimpleAliasRegistry.registerAlias()方法,具体的步骤如下,
步骤一: alias与beanName 相同的情况则不需要处理并删除掉原有alias
步骤二: alias覆盖处理, 若alias 已经使用并已经指向了了另一个beanName则需要用户设置进行处理.
步骤三:alias 循环检查,当A->B存在时,若再出现A->C->B就会抛出异常.
步骤四: 注册alisa;具体代码如下:
在这里插入图片描述
到目前为止,bean标签的解析和注册已完成, 当需要对注册bean事件进行监听时可通过注册监听器的方式将处理逻辑写入监听器中.但是Spring没有对时间做任何逻辑处理.

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

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

相关文章

Dreamweaver网页设计与制作100例 餐饮主题简洁日式料理餐饮网页设计(4页)HTML+CSS+JavaScript

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

[附源码]计算机毕业设计点餐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

音视频技术开发周刊 | 274

每周一期&#xff0c;纵览音视频技术领域的干货。新闻投稿&#xff1a;contributelivevideostack.com。「紧急通知」LiveVideoStackCon 2022 音视频技术大会北京站改期各位LVSer们&#xff1a;因疫情影响&#xff0c;北京近期不再允许举办大型线下活动&#xff0c;我们无奈且抱…

【消息中间件】为什么选择RocketMQ及使用案例

目录 一、为什么选择RocketMQ 1、为什么是为什么选择RocketMQ 2、RocketMQ、ActiveMQ和Kafka之间的比较 2.1、对比1 2.2、对比2&#xff0c;接着上表 二、使用案例 1、引入依赖 2、编写启动类 3、编写application.yml配置文件 4、创建rocketmq文件夹 4.1、创建生产者…

OpenCV实战(4)——像素操作

OpenCV实战&#xff08;4&#xff09;——像素操作0. 前言1. 图像的基本组成2. 访问像素值2.1 修改图像像素2.2 cv::Mat_ 模板类2.3 完整代码示例3. 用指针扫描图像3.1 图像扫描3.2 其他减色公式3.3 使用输入和输出参数3.4 高效扫描连续图像3.5 低阶指针算法4. 使用迭代器扫描图…

linux操作系统期末考试题库

1. cal命令 目录 1. cal命令 2.cat命令 3.cd命令 4.date命令 5.echo命令 6.grep命令 7.head 命令 8.ls 命令 9.touch 命令 10.more命令 11. ln创建链接命令 12.查看进程 13.mkdir命令 cal -3 cal 查看指定日期的日历 cal 4 2022 cal 2018 2.cat命令 cat -n /etc…

认识MyBatis

MyBatis是什么&#xff1f; MyBatis是dao层&#xff08;持久层&#xff09;框架&#xff0c;它支持自定义SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML或注解来配置和映射原始类型、接口和Java …

2022 NCTF

MISC 炉边聚会 卡组代码是 Base64 编码的字节串&#xff0c;exp <?php $deckstring "AAEDAZoFKIwGngXIBrwFzgnQBfIHygf0CIgJkAiBogJ1gjMCPIHtgeeBeAD6AfyB7YHvgbgAAD4AO2B7wFkgnMCMwIga2B/QImgi6BJAIiAn2BOIJAAA"; #这是⼀个⾮常有趣的萨满卡组 $binary bas…

非零基础自学Golang 2 开发环境 2.2 配置GOPATH

非零基础自学Golang 学习文档地址&#xff1a;https://www.topgoer.cn/ 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删【已联系过文档作者】 文章目录非零基础自学Golang2 开发环境2.2 配置GOPATH2.2.1 配置GOPATH2.2.2 go的项目目录2.2.3 适合个人开发…

[附源码]Python计算机毕业设计Django剧本杀交流分享平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

年产2万吨山楂酒工厂的设计-发酵工段及车间的设计(lunwen+任务书+cad图纸)

目录 1前 言 1 2总论 2 2.1设计依据 2 2.2设计指导思想和原则 2 2.3设计范围 2 2.3.1生产部门 2 2.3.2设计图纸 3 2.4工艺设计基本数据和指标 3 2.5生产工艺概述 3 2.6生产设备概述 4 2.7生产工艺流程图 4 2.8生产方法的简单介绍 6 3全程物料衡算 7 3.1全程总物料概算 7 3.1.1山…

MySQL主从同步

©网络研究院 安装环境 基本需求 ——采用CentOS7系统搭建MySQL服务器 ——关闭防火墙 ——关闭SELinux ——软件 MySQL-5.7.17-1 安装MySQL 续&#xff08;1&#xff09; 从官方下载RPM软件包 ——http://dev.mysql.com/downloads/mysql/ ——适用于当前系统的b…

数图互通高校房产管理——校园电子地图

数图互通房产管理系统在这方面做得比较全面&#xff1b; 1、校园电子地图建设方案 支持地图和房间双向无缝对接。通过电子地图选择建筑物&#xff08;平面或立体&#xff09;能够查看建筑物信息、楼层平面布局图或立体图&#xff0c;点击楼层上的房间能够编辑或查看房间信息。…

非零基础自学Golang 2 开发环境 2.4 Git 安装

非零基础自学Golang 学习文档地址&#xff1a;https://www.topgoer.cn/ 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删【已联系过文档作者】 文章目录非零基础自学Golang2 开发环境2.4 Git 安装2.4.1 安装git2 开发环境 2.4 Git 安装 2.4.1 安装git 虽…

Web 性能测试

Web 性能测试 作为网站应用的开发者或维护者&#xff0c;我们需要时常关注网站当前的健康状况&#xff0c;譬如在主流程运行正常的情况下&#xff0c;各方面性能体验是否满足期望&#xff0c;是否存在改进与提升的空间&#xff0c;如何进行快速且准确的问题定位等&#xff0c;…

mongoDB操作文档(全部)

mongoDB 1、创建、查询数据库 创建数据库 use dade 查询数据库 show dbs 2、创建集合、查看 创建集合插入数据 db.集合名.insert({}) db.dade.insert({dade:大得,age:18}) ​ 查看集合 show tables ​ 查看集合中的数据 db.集合名.find() 查询所有 db.dade.find() ​ db.集…

微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.1 基本介绍

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构16 SpringAMQP16.1 基本介绍16.1.1 什么是SpringAMQP16 SpringAMQP 16.1 …

Android -- 每日一问:你在Android开发中遇到的技术难题是什么,你是怎么解决的?

经典回答 一个工作过几年的程序员肯定会有工作中遇到技术难点问题&#xff0c;虽然这个问题有可能对于别人不是技术难点&#xff0c;但只要对于当时的你是技术难点&#xff0c;只要让你抓耳挠腮毫无头绪就往往会在你的大脑中留下深刻的印象。 这个问题&#xff0c;我也比较难…

【三维目标检测】VoteNet(二)

VoteNet数据和源码配置调试过程请参考上一篇博文&#xff1a;【三维目标检测】VoteNet&#xff08;一&#xff09;_Coding的叶子的博客-CSDN博客。本文主要详细介绍VoteNet网络结构及其运行中间状态。 1 VoteNet模型总体过程 VoteNet核心思想在于通过霍夫投票的方法实现了端到…

[附源码]计算机毕业设计基于SpringBoot的高校课程知识库

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…