标签:
分析
MyBatis整合Spring的实现(2)中属性可以知道,XPathParser类在XMLConfigBuilder中充当了非常重要的角色,下面就来分析XPathParser的作用。
1 属性
1.1 XPathParser属性:
/** 整个XML文档 */ private Document document; /** 是否已验证,true:是,false:否 */ private boolean validation; /** 用于解析实体的基本接口 */ private EntityResolver entityResolver; /** 属性 */ private Properties variables; /** XPath提供了对XPath计算环境和表达式的访问 */ private XPath xpath;
2 构造器
XPathParser实例化的构造器为:
3 方法
根据构造器可以看出,经过2个方法,最后生成了Document。
3.1 commonConstructor
方法中只是把属性放入相应的值。
3.2 createDocument方法
private Document createDocument(InputSource inputSource) { // important: this must only be called AFTER common constructor try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setValidating(validation); factory.setNamespaceAware(false); factory.setIgnoringComments(true); factory.setIgnoringElementContentWhitespace(false); factory.setCoalescing(false); factory.setExpandEntityReferences(true); DocumentBuilder builder = factory.newDocumentBuilder(); builder.setEntityResolver(entityResolver); builder.setErrorHandler(new ErrorHandler() { public void error(SAXParseException exception) throws SAXException { throw exception; } public void fatalError(SAXParseException exception) throws SAXException { throw exception; } public void warning(SAXParseException exception) throws SAXException { } }); return builder.parse(inputSource); } catch (Exception e) { throw new BuilderException("Error creating document instance. Cause: " + e, e); } }
这里就是JDK底层提供的创建一个Document,这里需要自己去查看JDK API,不在过多的分析。
4 MyBatis配置解析(XMLMapperEntityResolver)
上面只是看到代码解析成Document文档,但是MyBatis是如何找到自己的文档的呢?下面就来分析。
MyBatis整合Spring的实现(2)中2.1已经提到“默认DTD文件解析类(XMLMapperEntityResolver)“。那么就看这里代码如何。
图中红框中发现了,MyBatis配置的全局配置文件定义。
4.1 XMLMapperEntityResolver的接口EntityResolver
EntityResolver用于解析实体的基本接口。只提供了一个方法resolveEntity,且子类必须实现。
4.2 resolveEntity方法
代码先根据publicId获取InputSource,如果没有,在根据systemId获取InputSource。
总结:
经过3章的分析,了解Mybatis如果对全局配置文件进行读取并生成Document。以上的类中已经很多可以公用的,比如XPathParser类,没有具体的逻辑代码,只是一个XML到Document的转换,所以后面分析的Mybatis对SQL配置的解析也使用了此类。本文4中XMLMapperEntityResolver类也已经把SQL的Mapper文件考虑进去。
标签:
原文地址:http://my.oschina.net/u/1269959/blog/521713