代码
上图是spring 配置bean的XML文件。其中有指定spring-beans使用的spring-beans-3.0.xsd文件的url。一般情况下对于schema 下对应的文件都是通过网络去加载,但是我们可以发现,在我们本机电脑不联网的时候,也是可以获取.xsd文件来对XML进行校验和解析。spring是如何做到这点的呢?
spring对于XML的解析
spring 对于XML的解析用到了jdk jar包中自带的内容 JAXP去解析XML文件的。
spring中对于XML解析为Document 是委托给DefaultDocumentLoader,关键代码如下:
标准的通过JAXP解析XML的步骤,创建工厂,创建解析类,然后进行解析。其中有一个EntityResolver,这里是解析并获取到对应的.XSD文件的关键。
spring对于dtd、xsd文件的查找
spring 中对于DTD、XSD文件的查找是委托给了DelegatingEntityResolver
可以看到,对于DTD的查找委托给了BeansDtdResolver,对于XSD schemas的查找委托给了PluggableSchemaResolver。
PluggableSchemaResolver
从图中可以看到,spring会加载当前classLoader下面的所有的指定位置(META-INF/spring.schemas)的文件,并将其转换为Properties
我们可以看一下spring-beans包下自带的spring.schemas
前面是对应的schemaLocation中指定的xsd文件所在的路径,后面为xsd文件在jar包中的位置。这样spring就根据schemaLocation查找到了对应的XSD文件
BeansDtdResolver
对于DTD文件,spring会查找classpath下面是的名字为spring-beans.dtd的文件。