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数据血缘技术建设实践
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 DataLeap是火山引擎数智平台VeDI旗下的大数据研发治理套件产品,帮助用户快速完成数据集成.开发.运维.治理 ...
- Solon2 开发之IoC,九、自定义注解开发汇总
1.定义构建能力注解,比如@Controller 注解类: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Docum ...
- 标注BIO-精灵标注助手
目录 准备待标注数据 将待标数据生成文件 数据标注 下载标注软件 创建项目 标注数据 导出数据 ANN 转 BIO 推荐使用 Label Studio 准备待标注数据 创建 raw_data.txt ...
- Kubernetes(K8S) helm 安装
Helm 是一个 Kubernetes 的包管理工具, 就像 Linux 下的包管理器, 如 yum/apt 等, 可以很方便的将之前打包好的 yaml 文件部署到 kubernetes 上. Hel ...
- 【python爬虫】bs4遍历、搜索文档树 bs4使用css选择器 selenium基本使用 selenium查找标签 selenium执行js代码
目录 上节回顾 今日内容 0 bs4遍历文档树 1 bs4搜索文档树 1.1 find方法的其他参数 2 css选择器 3 selenium基本使用 4 无界面浏览器 4.1 模拟登录百度 5 sel ...
- 网传的Spring大漏洞
昨天凌晨发了篇关于Spring大漏洞的推文,白天就有不少小伙伴问文章怎么删了. 主要是因为收到朋友提醒说可能发这个会违规(原因可参考:阿里云因发现Log4j2核弹级漏洞但未及时上报,被工信部处罚),所 ...
- mysql 使用 trim去不掉空格 解决
使用mysql8.0时 发现 有几个空字符串怎么也过滤不掉,使用 is not null.trim()<>''.length()>=1都不行,最后查了一些资料说 trim只能去除半角 ...
- 打包报错,提示UglifyJs Unexpected token: keyword «const»
https://blog.csdn.net/weixin_43473561/article/details/102816018 原因:ugluifyjs当前版本不符合项目预期(可能不能解析es6) 解 ...
- freeswitch的2833和inband对接方案
概述 freeswitch支持三种模式的DTMF传输方式,分别时inband.INFO.2833. 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中, ...
- 如何使用ps抠图(两种扣图方法)
PS抠图的方法有很多种,以下是其中两种常用的方法: 方法一:适用于背景颜色单一.较为简单的图片. 选中魔棒工具/魔术橡皮擦,点击背景,出现选区,点击Delete键删除. 点击快速选择工具,沿着所需图形 ...