深入理解MyBatis(二)—MyBatis初始化

深入理解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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值