Spring源码之XML文件中Bean标签的解析2
读取XML文件,创建默认bean标签对象的核心代码
在DefaultBeanDefinitionDocumentReader类中的如下方法中:
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
_________标注1
if (bdHolder != null) {
bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
_________标注2
try {
// Register the final decorated instance.
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
___________标注3
}
catch (BeanDefinitionStoreException ex) {
getReaderContext().error("Failed to register bean definition with name '" +
bdHolder.getBeanName() + "'", ele, ex);
}
// Send registration event.
getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
___________标注4
}
}
标注1——delegate.decorateBeanDefinitionIfRequired(ele, bdHolder)的作用
可以解析出如下标签
<bean id="" class="" scope="" abstract="" parent="" depend-on>
<property
<construtor-args>
<lookup-method>
<replace-method>
</bean>
标注2——delegate.parseBeanDefinitionElement(ele)的作用——(非核心)
这是解析出bean中自定义的子标签(如果有的话)
比如:
解析<bean标签内部存在自定义标签
<bean id="" class="" scope="">
<property name="" value=""/>
<sjdwz:text />
</bean>
其中sjdwz就是自定义子标签。
标注3——BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry())
把解析好的BeanDefinition进行注册(注册的概念,实际上是存储);
那在哪完成注册呢?

标注4——getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
send registion event
目的: BeanDefinition注册完成后,发送一个事件,如果需要扩展,则实现监听接口,默认空实现
自定义标签的解析过程
自定义标签举例
<mvc:annotation-driven />
<context:component-scan />
这些标签肯定对特定的类型。
<mvc:annotation-driven />
在源码,spring-webmvc包的resource目录,有这两个文件:
spring.handlers——用来处理特殊的namespace,或者schema
spring.schemas

这就是这个标签的定义。
我们在使用的时候,可以先引入xsd,在写这个标签。

我们可以看到,他是被org.springframework.web.servlet.config.MvcNamespaceHandler类处理的

这个类的定义如下

这个类的作用就是注册一些类的BeanDefinition。
自己设计一个自定义标签

自定义标签解析过程
通过handler----->Parser--------------->封装成BeanDefinition。

Spring源码之XML文件中Bean标签的解析2的更多相关文章
- Spring源码分析(七)bean标签的解析及注册
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 在上一篇中提到过Spring中的标签包括默认标签和自定义标签两种,而两种 ...
- Spring源码学习(2)——默认标签的解析
上一篇随笔说到Spring对于默认标签和自定义标签的解析方法是不同的,这里详细看一下Spring对于默认标签的解析. private void parseDefaultElement(Element ...
- 如何将spring源码导入到eclipse中
如何将spring源码导入到eclipse中 1. 下载spring源码 可以在github官网中找到spring源码来下载,或者直接通过git下载,是一样的,这里演示 直接在github网站下载, ...
- Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...
- Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...
- Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件
写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设 ...
- 从零开始学spring源码之xml解析(二):默认标签和自定义标签解析
默认标签: 上一篇说到spring的默认标签和自定义标签,发现这里面东西还蛮多的.决定还是拆开来写.今天就来好好聊聊这两块是怎么玩的,首先我们先看看默认标签: private void parseDe ...
- 从零开始学spring源码之xml解析(一):入门
谈到spring,首先想到的肯定是ioc,DI依赖注入,aop,但是其实很多人只是知道这些是spring核心概念,甚至不知道这些代表了什么意思,,作为一个java程序员,怎么能说自己对号称改变了jav ...
- 0源码基础学习Spring源码系列(一)——Bean注入流程
作者:京东科技 韩国凯 通过本文,读者可以0源码基础的初步学习spring源码,并能够举一反三从此进入源码世界的大米! 由于是第一次阅读源码,文章之中难免存在一些问题,还望包涵指正! 一. @Auto ...
- Spring源码分析(十一)bean的加载
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 经过前面的分析,我们终于结束了对XML配置文件的解析,接下来将会面临更大 ...
随机推荐
- 活动回顾|火山引擎 DataLeap 分享:DataOps、数据治理、指标体系最佳实践(文中领取 PPT)
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在 7 月 21 日至 22 日举行的 ArchSummit 全球架构师峰会(深圳站)及 DataFunCon.数 ...
- Caused by: java.lang.ClassNotFoundException: javax.servlet.Filter
Caused by: java.lang.NoClassDefFoundError: javax/servlet/Filter at java.lang.Class.getDeclaredMethod ...
- MongoDB 副本模式,会映射到本地 127.0.0.1 错误
基于 MongoDB 读写分离--Windows MongoDB 副本集配置 ,里面配置了一个坑,导致出现下列错误 [2021-05-10 10:06:11.981] [cluster-Cluster ...
- GitLab--安装部署
配置信息 系统:centos7.8 gitlab版本:12.8.8 1 下载gitlab wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum ...
- InnoDB 事务加锁分析
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/S7MhlsZveBHRSQhq5aTIJA作者:何志创 一般大家对数据库事务的了解可能停留在事 ...
- vivo 悟空活动中台-基于行为预设的动态布局方案
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/CwLAV2j7Uxam01m1p7cXxg作者:悟空中台研发团队 [悟空活动中台]系列往期精彩 ...
- 手把手实践教你删除项目当中无用的npm包
在公司中,我们大部分都是多人共同开发和长时间维护一个项目,但是有时候我们会发现有很多已经废弃的npm 包存在 package.json 中,我们想要删除,但是又不能盲目的删除?那么 depcheck ...
- [Qt开发/毕业设计/求职项目]局域网环境下远程文件发送部署系统-服务端、客户端双端的讲解
写在前面 本文旨在做一个简单的代码讲解,我会给出源码,然后整个代码的讲解都在源码的基础上进行. 代码可能会随着更新而进行修改,但是整体框架变化不会太大. 整个文章内容不会太多,算是我自己的一个复盘,整 ...
- C# Redis的五大数据结构相关操作及应用场景
Cache和NoSql.Redis ServiceStack.Redis 下面额代码类均是通过 ServiceStack.Redis 来对Redis进行各种操作 redis 文件配置类 /// < ...
- git添加被.gitignore忽略的文件
技术背景 在git操作中,有时候为了保障线上分支的简洁性,会在.gitignore文件中屏蔽一些关键词,比如可以加一个*.txt来屏蔽掉项目中所有带txt后缀的文件,还可以加上*test*来屏蔽所有的 ...