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配置文件的解析,接下来将会面临更大 ...
随机推荐
- Python 将省、市 json 替换 成拼音
1.将 city_code_cn.json 中的省.市.区,翻译成英文,或直接替换去掉省.市 如:苏州市 -> 苏州 转成拼音后就变成 Suzhou,否则就会转成 Suzhoushi 怪怪的 ...
- Docker 安装 Elasticsearch、Kibana
为了Skywalking 准备 elasticsearch 至少 需要2G内存 docker pull elasticsearch:7.9.3 docker run --name elasticsea ...
- loguru python中记录日志
loguru python中记录日志 安装 pip install loguru 使用 from loguru import logger # logger.add('ck/test_log.log' ...
- 牛客 | 一起来做题~欢乐赛2 (AK 题解)
补题链接:Here A.新比赛,在眼前. 对于每次猜数和裁判的判断,可以确定一个区间内所有的数都有可能,比如对于样例中(8 +)来说,[ -INT_MIN, 7] 中所有的数都有可能,那么对于每次猜数 ...
- 技术文档 | 在Jenkins及GitlabCI中集成OpenSCA,轻松实现CI/CD开源风险治理
插播: OpenSCA-cli 现支持通过 homebrew 以及 winget 安装: Mac/Linux brew install opensca-cli Windows winget inst ...
- vue用qrcodejs2生成二维码,解决多个二维码追加的问题
vue使用qrcodejs2生成二维码 1.安装qrcodejs2 npm install qrcodejs2 2.代码 //导入组件 import QRCode from 'qrcodejs2' / ...
- scroll-view横向滚动的问题
最近在做一个小程序的项目,在写demo的时候,需要用到scroll-view来实现横向滚动的效果: 按照官方文档来写简直坑到家了,正确的写法如下: <scroll-view scroll-x=& ...
- java实现微信扫码登录功能 精讲
java实现微信扫码登录功能 精讲 https://www.bilibili.com/video/BV1RJ411N7ne?from=search&seid=18091761082032798 ...
- sql server主从同步
sql server主从方案介绍 sql server 作为目前主流的数据库,用户遍布世界各地.sql server也有一些比较成熟的主备方案,目前主要有:复制模式(发布-订阅模式).镜像传输模式 ...
- 最近遇到的问题记录:UrlEncode、UrlDecode
本文阅读前了解知识:什么时候需要使用UrlEncode和UrlDecode函数 作者使用谷歌浏览器,通过按下F12对第三方网站http协议的接口抓包进行分析操作. 场景 运维小哥哥偶尔使用某某外包公司 ...