我们先看下配置文件的结构
配置文件解析入口SqlSessionFactoryBuilder的build方法
build方法,把我们的配置以流的方法读取到内存中,然后传过来
继续看他调用的重载的build方法
方法内部构造了一个XMLConfigBuilder对象,进入XMLConfigBuilder内部,构造器又调用了另外一个构造器
另外一个构造器需要接受一个XPathParser对象,所以在当前构造器内创建了一个XPathParser对象,再继续点进XPathParser对象里
我们看下createDocument方法
private Document createDocument(InputSource inputSource) {
// important: this must only be called AFTER common constructor
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
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() {
@Override
public void error(SAXParseException exception) throws SAXException {
throw exception;
}
@Override
public void fatalError(SAXParseException exception) throws SAXException {
throw exception;
}
@Override
public void warning(SAXParseException exception) throws SAXException {
// NOP
}
});
return builder.parse(inputSource);
} catch (Exception e) {
throw new BuilderException("Error creating document instance. Cause: " + e, e);
}
}
可以看出mybatis配置文件解析用的是DOM方式, 并配合使用XPth。
继续调用SqlSessionFactoryBuilder的重载方法build,将parse方法返回一个Configuration对象传进来,使用默认的DefaultSqlSessionFactory返回一个SqlSessionFactory对象
下面我们重点看一下XMLConfigBuilder的parse方法
重点看parseConfiguration方法,上面我们已经看到了同DOM解析方式, 并配合使用XPth将配置文件解析,生成了一个XPathParser对象。在这里我们获取对象的节点configuration,也就是我们配置文件的根节点对象。配置文件所有属性解析都在这个方法里