百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Spring源码阅读:Spring XML解析机制

xsobi 2024-11-24 23:35 20 浏览

XML的解析机制

通过AbstractXmlApplicationContext类可以看到,XML解析是由XmlBeanDefinitionReader类实现的:

我们先看一看spring的xml配置文件的结构:

Spring的xml配置文件遵循了xml规范,我们常用的component-scan或者aop config分别在context和aop这两个命名空间中,beans是根标签,beans的每一个子标签对应一个BeanDefinition对象。

我们再看看Spring在xml解析的思路,打开spring-context包或者spring-aop包,以context包为例,可以在jar包的META-INF目录下看到以下文件:

打开其中的spring.handlers文件,可以看到以下内容:

文件内容是命名空间与某个NamespaceHandler接口的实现类的映射关系,aop包中的spring.handlers文件的内容也类似:

再打开spring.schemas文件,可以看到类似如下内容:

spring.handlers和spring.schemas的作用很明显,前者类似于java提供的SPI机制,用于获取命名空间解析器,后者用于指定xsd文件的路径。

NamespaceHandler接口定义如下(省略了javadoc注释):

public interface NamespaceHandler { void init(); BeanDefinition parse(Element element, ParserContext parserContext); BeanDefinitionHolder decorate(Node source, BeanDefinitionHolder definition, ParserContext parserContext);}

其中三个方法:

1. init方法表示初始化;

2. parse方法表示解析一个BeanDefinition对象并注册到BeanDefinitionRegistry接口中,BeanDefinitionRegistry接口和BeanDefinition的意义前文描述过,这里不再重述;

3. decorator方法表示解析一个xml标签,并对Bean定义做装饰,所谓的装饰即对bean定义的子标签做处理;

打开一个NamespaceHandler类,比如AopNamespaceHandler,可以看到其init方法中在注册BeanDefinitionParser和BeanDefinitionDecorator对象,

对应NamespaceHandler接口中的方法,registerBeanDefinitionParser方法则是注册用于将该命名空间下的某个标签解析成BeanDefinition对象,registerBeanDefinitionDecoreator方法则是用于解析某个Bean配置的该命名空间下的子标签。打开某个BeanDefinitionParser的实现,即可看到解析bean定义(BeanDefinition)。

回到XmlBeanDefinitionReader类,此类中除了读取xml文件的内容外,有一个初始化相关的重要属性namespaceHandlerResolver,此属性的接口类型如下:

接口声明非常简单,即通过namespace的url获取NamespaceHandler,从此接口的定义来看正是使用spring.handlers文件中的内容并为bean定义的解析提供服务。从XmlBeanDefinitionReader接口中可以看到此属性的初始化:

默认使用的是DefaultNamespaceHandlerResolver类,此类的实现比较简单,加载spring.handlers文件并初始化NamespaceHandler。

XML配置的扩展

前文描述了spring的xml配置解析的思路,是通过在jar包的META-INF/spring.handlers文件中的NamespaceHandler来解析bean的,基于spring的xml解析机制,我们可以自定义实现xmlns以及相关的BeanDefinitionParser和BeanDefinitionDecorator。

假设需要实现以下xml配置功能:

这个配置的意思是,/META-INF/app.properties文件中取变量(用${xxx}表示),如果${env}的值等于local,则配置TestBean,如果存在${appName}则设置appName属性,如果不存在${run_mode}则设置runMode属性值为0。

配置文件中新的标签有两种使用方式:

· 作为beans的第一级子标签,这种使用方式需要BeanDefinitionParser来处理

· 作为bean标签的子标签,作用于property属性之上,这种使用方式是对bean的装饰过程,需要BeanDefinitionDecorator来处理

从这份配置内容可以看出引入了新的名叫ctl的xmlns,ctl是自定义的命名空间,按照前文所述的spring xml解析机制,那么我们为ctl命名空间编写xsd文件以及spring.handlers和spring.schemas文件:

Bash
编写CtlNamespaceHandler类:

以if标签为例,IfBeanDefinitionParser类的实现如下(省略细节,具体代码见github: https://github.com/gaohanghbut/springcfg):

相关推荐

适合在企业网站展示企业发展历程的时间轴滑动特效源码

大家好,今天给大家介绍一款,JavaScript实现的适合在企业网站展示企业发展历程的滑动特效源码(图1)。送给大家哦,获取方式在本文末尾。可以用鼠标左右滑动查看,也可以点击左右按钮查看(图2)源码完...

别再花钱请人画了!一个工具就能把照片动漫化,小白也能轻松学会

前阵子公司里一个妹子的微信换了个新头像,是用把本人的照片动漫化,有点像抖音爆火的那种漫画脸特效。我感觉很不错,既保留了自己的外貌,也挺有个性的。本来以为是她自己做的,没想到她居然告诉我是花钱请人画的...

手机如何制作变年轻特效?手把手教你这几个实用方法

现在的图片特效是越来越丰富,我们可以通过各种软件把一张照片上玩出各种花样。特别是最近流行的时光穿梭机特效,能让我们看到从年轻到变老的自己。那么你们知道时光穿梭机特效如何制作吗?下面我就来告诉你们3个很...

如何快速查看自己的网站是否被入侵

要快速查看自己的网站是否被入侵,可采取以下步骤:一、检查网站内容查看网站主页及其他重要页面,确认是否存在未经授权的更改,如新链接、广告或内容。二、使用在线工具利用第三方服务,如360网站安全检测平...

10个免费pr模板下载网站,不用AE也能解决你的片头片尾难题

之前有人问我AE太难了,PR能不能做效果,我就推荐了几个小教程,尴尬的是,他说就想用来做片头片尾,emmm……那我就来推荐几个PR模板下载网站吧。以下是我整理的一共有10个PR模板下载网站,其中全站免...

高质量特效视频素材,累积14套507.6GB,必备影视后期素材库!

收藏一时爽,一直收藏一直爽!欢迎来到宝藏后期资源系列,这是一期非常全面的特效素材,都是好莱坞大片级的特效。这是一期期待已久的特效素材资源,来自知名Bigfilms素材网站。在此之前已经安利了13套...

CSS 3.0+HTML5.0制作各种网页特效

1、C33实现点击图片渐渐放大特效2、CSS3实现图片全屏背景特效3、CSS3实现的鼠标移动到图片上不规则放大3、jQuery+CSS3模拟苹果桌面系统4、CSS3+jQuery照片...

太优秀了!高逼格的动画效果,只用 PPT 就能做出来

如果你需要做一场演讲、一个述职汇报,又或者是一个毕业答辩,可能都会尝试用PPT做一份演示文稿,来辅助表达。但是,想想开会时,老板在屏幕前做的演示稿,是不是一点也不想看:因为,大多数人做的PPT可能是这...

分享7个关于AE的网站

今天我分享几个和ae有关的好的网站,希望给对ae有兴趣但却还没入门的人一个帮助。1、http://www.lookae.com/这是一个简洁而美观的网站,提供AE、PR、C4D等的软件、插件、模板的...

Gif已out !三分钟教你做动图特效

360搜索前段时间推出过一款“拍题神器”,引发广泛反响,包括央视、北京卫视等主流媒体相继对此功能进行了报道,正值外界还在对“拍题神器”激烈讨论之际,360移动搜索再推新功能,“玩图”一经推出之后便迅速...

推荐几个神级的特效网站

随机粒子http://www.spielzeugz.de/html5/liquid-particles-3D对称光绘http://weavesilk.com高亮流体https://paveldogre...

让网站动起来的js库,真漂亮,再也不用写复杂的动画了~wow.js

前言越来越多的网站特效很漂亮,其中就有一种我很喜欢的动画,就是当滑动到某个元素的时候,元素就是出现动画效果,如:缩放、旋转、滑动等。感觉很漂亮,之前在做企业站的时候,基本上都是自己手写的,有点麻烦而且...

垃圾回收日志记录是否会影响应用性能?

尽管性能成本极低,但垃圾回收日志提供了宝贵的见解,说明JVM如何在运行时动态管理内存。译自DoesGarbageCollectionLoggingAffectAppPerforman...

73人死亡!墨西哥炼油厂发生爆炸!目击者:偷油者当场烧成灰

据新华社消息,墨西哥中部伊达尔戈州一处输油管道18日遭遇“偷油”后发生爆炸。截至小编发文,该爆炸造成的死亡人数已升至73人。▲图片截取自CNN;《墨西哥油管爆炸至少73名人员丧生,数十位受伤》这次严重...

Net平台GC VS JVM垃圾回收

前言不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照后...