深入理解MyBatis(二)—MyBatis初始化
MyBatis的配置信息存储在XML配置文件中,使用Configuration对象作为一个所偶有配置信息的容器,Configuration对象的组织结构和XML配置文件的组织结构几乎完全一样,因此MyBatis初始化就是加载XML配置文件,创建Configuration对象的过程;
个人主页:tuzhenyu’s page
原文地址:深入理解MyBatis(二)—MyBatis初始化
(1) Configuration创建和加载
- MyBatis的初始化入口是从SqlSeesionFactory的创建开始的,将生成的配置文件输入流传递到SqlSessionBuilder类的build()方法中构建SqlSessionFactory实例
String resource = "mybatis/config.xml";
InputStream is = Main.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(is);
- 调用build()方法的重载方法,首先根据配置文件输入流进行XML解析,再根据解析结果创建SqlSessionFactory实例
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder e = new XMLConfigBuilder(reader, environment, properties);
var5 = this.build(e.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException var13) {
;
}
}
return var5;
}
- XMLConfigBuilder在构造器中创建XPathParser实例,进行XML配置输入流的解析
public XMLConfigBuilder(InputStream inputStream, String environment, Properties props) {
this(new XPathParser(inputStream, true, props, new XMLMapperEntityResolver()), environment, props);
}
- commentConstrutor()方法主要是对validation等属性进行定义,根据输入流创建Document的主要逻辑主要在createDocoument()方法中;
public XPathParser(InputStream inputStream, boolean validation, Properties variables, EntityResolver entityResolver) {
this.commonConstructor(validation, variables, entityResolver);
this.document = this.createDocument(new InputSource(inputStream));
}
createDocument()方法根据XML输入流创建Document实例的方法和Spring中将XML文件解析成Doucment方法相同,都是通过SAX的方法解析XML文档;
首先创建DocumentBuilderFactory,再通过DocumentBuilderFactory创建DocumentBuilder,进而解析inputSource()返回Document对象;在解析过程中调用”org.xml.sax”包下额SAX解析方法,创建DOM树;
解完的Document会存储在XPathParser实例对象中,XPathParser对象会存储在XMLConfigBuilder对象中,调用XMLConfigBuilder的parse()方法进行进一步解析;
private Document createDocument(InputSource inputSource) {
try {
DocumentBuilderFactory e = DocumentBuilderFactory.newInstance();
e.setValidating(this.validation);
e.setNamespaceAware(false);
e.setIgnoringComments(true);
e.setIgnoringElementContentWhitespace(false);
e.setCoalescing(false);
e.setExpandEntityReferences(true);
DocumentBuilder builder = e.newDocumentBuilder();
builder.setEntityResolver(this.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 var4) {
throw new BuilderException("Error creating document instance. Cause: " + var4, var4);
}
}
XPathParser实例的parse()方法通过xpath的方法对XML进行解析,首先定位configuration标签作为根标签;
与Spring解析XML不同的是Spring仅仅通过SAX