MyBatis整合Spring的实现(3)

分析

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实例化的构造器为:

105823_EEvI_1269959.jpg

3 方法

根据构造器可以看出,经过2个方法,最后生成了Document。

3.1 commonConstructor

110053_2Lrt_1269959.jpg

方法中只是把属性放入相应的值。

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)“。那么就看这里代码如何。

111824_PcVo_1269959.jpg

图中红框中发现了,MyBatis配置的全局配置文件定义。

4.1 XMLMapperEntityResolver的接口EntityResolver

EntityResolver用于解析实体的基本接口。只提供了一个方法resolveEntity,且子类必须实现。

4.2 resolveEntity方法

112157_9GRc_1269959.jpg

代码先根据publicId获取InputSource,如果没有,在根据systemId获取InputSource。

总结:

经过3章的分析,了解Mybatis如果对全局配置文件进行读取并生成Document。以上的类中已经很多可以公用的,比如XPathParser类,没有具体的逻辑代码,只是一个XML到Document的转换,所以后面分析的Mybatis对SQL配置的解析也使用了此类。本文4中XMLMapperEntityResolver类也已经把SQL的Mapper文件考虑进去。

转载于:https://my.oschina.net/u/1269959/blog/521713

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值