Spring是如何校验XML的
首先来看下xml的一些概念:
xml的schema里有namespace,可以给它起个别名。比如常见的spring的namespace:
xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"
通常情况下,namespace对应的URI是一个存放XSD的地址,尽管规范没有这么要求。如果没有提供schemaLocation,那么Spring的XML解析器会从namespace的URI里加载XSD文件。我们可以把配置文件改成这个样子,也是可以正常工作的:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans/spring-beans.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
schemaLocation提供了一个xml namespace到对应的XSD文件的一个映射,所以我们可以看到,在xsi:schemaLocation后面配置的字符串都是成对的,前面的是namespace的URI,后面是xsd文件的URI。比如:
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd"
Spring是如何校验XML的
Spring默认在启动时是要加载XSD文件来验证xml文件的,所以如果有的时候断网了,或者一些开源软件切换域名,那么就很容易碰到应用启动不了。我记得当时Oracle收购Sun公司时,遇到过这个情况。
为了防止这种情况,Spring提供了一种机制,默认从本地加载XSD文件。打开spring-context-3.2.0.RELEASE.jar,可以看到里面有两个特别的文件:
spring.handlers
http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler
http\://www.springframework.org/schema/jee=org.springframework.ejb.config.JeeNamespaceHandler
http\://www.springframework.org/schema/lang=org.springframework.scripting.config.LangNamespaceHandler
http\://www.springframework.org/schema/task=org.springframework.scheduling.config.TaskNamespaceHandler
http\://www.springframework.org/schema/cache=org.springframework.cache.config.CacheNamespaceHandler
spring.schemas
http\://www.springframework.org/schema/context/spring-context-2.5.xsd=org/springframework/context/config/spring-context-2.5.xsd
http\://www.springframework.org/schema/context/spring-context-3.0.xsd=org/springframework/context/config/spring-context-3.0.xsd
http\://www.springframework.org/schema/context/spring-context-3.1.xsd=org/springframework/context/config/spring-context-3.1.xsd
http\://www.springframework.org/schema/context/spring-context-3.2.xsd=org/springframework/context/config/spring-context-3.2.xsd
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd
...
再打开jar包里的org/springframework/context/config/ 目录,可以看到下面有
spring-context-2.5.xsd
spring-context-3.0.xsd
spring-context-3.1.xsd
spring-context-3.2.xsd
很明显,可以想到Spring是把XSD文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载XSD文件。
并且Spring很贴心,把旧版本的XSD文件也全放了。这样可以防止升级了Spring版本,而配置文件里用的还是旧版本的XSD文件,然后断网了,应用启动不了。
我们还可以看到,在没有配置版本号时,用的就是当前版本的XSD文件:
http\://www.springframework.org/schema/context/spring-context.xsd=org/springframework/context/config/spring-context-3.2.xsd
同样,我们打开dubbo的jar包,可以在它的spring.schemas文件里看到有这样的配置:
http\://code.alibabatech.com/schema/dubbo/dubbo.xsd=META-INF/dubbo.xsd
所以,Spring在加载dubbo时,会从dubbo的jar里加载dubbo.xsd。
转载于:https://www.cnblogs.com/tijun/p/7659943.html
Spring是如何校验XML的相关推荐
- Spring装配Bean---使用xml配置
声明Bean Spring配置文件的根元素是<beans>. 在<beans>元素内,你可以放所有的Spring配置信息,包括<bean>元素的声明. 除了Bean ...
- Spring中加载xml配置文件的六种方式
Spring中加载xml配置文件的六种方式 博客分类: Spring&EJB XMLSpringWebBeanBlog 因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装 ...
- Spring 3 MVC and XML example
Spring 3 MVC and XML example 本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/520 ...
- JBPM流程部署校验之java利用XSD校验XML
JBPM流程定义校验之java利用XSD校验XML 上篇我们学习了在.net中怎样利用XSD来验证xml,今天我们来看一下在java中怎样实现利用xsd来校验xml! /** * */ pack ...
- Spring Cache抽象-基于XML的配置声明(基于EhCache的配置)
概述 完整示例 pomxml增加依赖 数据库表数据Oracle 实体类 服务层 ehcache的配置文件 Spring-EhCache配置文件 单元测试 日志输出 日志分析 示例源码 概述 首先请阅读 ...
- Spring Cache抽象-基于XML的配置声明(基于ConcurrentMap的配置)
概述 示例 项目结构 数据库表数据Oracle 实体类 服务层 Spring配置文件 单元测试 日志输出 日志分析 示例源码 概述 Spring Cache基于注解的配置 如果不想使用注解或者由于其他 ...
- Spring源码-applicationcontext.xml解析过程
为什么80%的码农都做不了架构师?>>> Spring源码-applicationcontext.xml解析过程 核心流程:Spring中对于applicationcontex ...
- Spring MVC的web.xml配置详解(转)
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在 ...
- 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法
转载自 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法 我们在配Spring 或者Hibernate 配置文件的时候,发觉在配置类路径的时候,在双引号下 ...
最新文章
- python版mapreduce题目实现寻找共同好友
- 区块链BaaS云服务(14)华大BGI区块链“安全多方计算“
- 再说WCF Data Contract KnownTypeAttribute
- 【Python】Python库之游戏开发
- python处理excel的优势-SAS、R、SPSS、python、excel五大软件的比较优势分析
- Spring Cloud之Feign客户端调用工具
- HihoCoder1449 后缀自动机三·重复旋律6
- transformClassesWithProfilers-transformForDebug
- 【元胞自动机】基于matlab元胞自动机短消息网络病毒传播仿真【含Matlab源码 1289期】
- java封装的概念学习笔记
- Javascript特效代码大全(420个)
- usb抓包工具 安卓_USB抓包工具(Bus Hound)下载 v6.0.1 官方版
- 如何简单有效的同步油猴插件
- 分槽ALOHA协议仿真
- jQuery开发经验实例笔记
- 优化Docker镜像大小方案 2017年12月10日 17:54:46 阅读数:1774 标
- Java使用465端口发送邮件(绕过25端口限制)
- android 推送历史 coolapk,酷安(com.coolapk.market) - 11.2.2 - 应用 - 酷安
- 11个“高能”网站,学编程和赚钱两不误!
- Xshell登录进入CentOS 6.5系统后,Python交互模式和数据库模式下,出现乱码的问题及解决方法
热门文章
- [学习笔记]多项式指数函数
- PAT-B 1015. 德才论(同PAT 1062. Talent and Virtue)
- 编程3:仅用递归函数和栈操作逆序一个栈
- 20150928所学粗略整理
- HTML5 Canvas 自定义笔刷
- GHOST内部错误 36000(internal error 36000)情况的解决办法
- Android 4.1最终版SDK和ADT Plugin全线发布
- C#获取二叉树深度及分层遍历二叉树
- React-事件机制杂记
- webpack4.0各个击破(2)—— CSS篇