XML的验证模式保证了XML文件的正确性,比较常用的验证模式主要有两种,DTD和XSD
DTO和XSD验证模式的区别
DTO,称为文档类型定义,是一种XML约束模式语言,同时也
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
是XML的验证机制,验证的机制是通过比较XML文档和DTD文件来看文档是否符合规范
XSD,本身就是XML语言(Xml Scheme Definition),使用一个指定的XMl Scheme来验证某个XML文档,来检查该XML文档是否符合其要求,即XML Scheme可以限制XML文档所允许的结构和内容,并根据此检查XML文档是否有效
而验证模式的定义使用,是放在配置文件的头描述里面的
比如使用XSD
使用DTD格式的
验证模式的获取
获取验证模式,其实就是XmlBeanDefinitionReader调用了getValidationModeForResource方法
下面就来看看这个方法的底层
getValidationModeForResource
protected int getValidationModeForResource(Resource resource) {
//获取手动设置的验证模式(XmlBeanDefinitionReader可以设置validationMode)
//也就是从代码层面上进行设置
int validationModeToUse = getValidationMode();
//如果验证模式不是未指定的,就返回获取的验证模式
if (validationModeToUse != VALIDATION_AUTO) {
return validationModeToUse;
}
//如果获取的验证模式是未指定,则需要自动的检测(检测配置文件)
int detectedMode = detectValidationMode(resource);
//如果自动检测后得到的验证模式不是未指定的,返回
if (detectedMode != VALIDATION_AUTO) {
return detectedMode;
}
//如果配置文件上依然没有指定验证模式
//默认使用XSD模式(注释上写的原因是,因为找不到DTD所以使用XSD)
// Hmm, we didn’t get a clear indication… Let’s assume XSD,
// since apparently no DTD declaration has been found up until
// detection stopped (before finding the document’s root tag).
return VALIDATION_XSD;
}
从这个方法来看,设置验证模式可以有两种方式
-
通过XmlBeanDefinitionReader来获取validationMode,即从代码上设置validationMode,并且优先级最高
-
通过配置文件去获取validationMode,优先级最低
-
如果两个都没有设置,默认使用XSD验证模式
配置文件去获取validationMode(detectValidationMode方法)
对应的方法就是detectValidationMode方法
protected int detectValidationMode(Resource resource) {
//判断配置文件抽象成的resoure是不是open状态的
//如果处于open状态,则不能从该配置文件上读取验证模式
//因为open状态,表示已经被打开了
//被打开了就只能被读取一次然后马上关闭,因为可能会造成资源泄露
if (resource.isOpen()) {
throw new BeanDefinitionStoreException(
“Passed-in Resource [” + resource + "] conta