美文网首页mybaits源码学习
Mybatis源码学习(1)--SqlSessionFactor

Mybatis源码学习(1)--SqlSessionFactor

作者: yesAnd_ | 来源:发表于2020-07-08 22:14 被阅读0次

Mybatis源码学习(1)--SqlSessionFactoryBuilder

一、源码阅读的入口

阅读Mybatis源码的入口是类:SqlSessionFactoryBuilder,我们都知道sqlsession是mytais最核心类之一,而sqlsession是通过sqlSessionFactory工厂创建的,sqlSessionFactory采取的是builder构建者模式,也就是本类。

二、构建SqlSessionFactory

sqlSessionFactoryBuilder总提供了9中build()方法来构建factory,其中有两个是最主要的加载方式:

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
  try {
      //委托XMLConfigBuilder来解析xml文件,并构建
    XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
    return build(parser.parse());
  } catch (Exception e) {
      //这里是捕获异常,包装成自己的异常并抛出的idiom?,最后还要reset ErrorContext
    throw ExceptionFactory.wrapException("Error building SqlSession.", e);
  } finally {
    ErrorContext.instance().reset();
    try {
      reader.close();
    } catch (IOException e) {
      // Intentionally ignore. Prefer previous error.
    }
  }
}

和:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
  try {
    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
    return build(parser.parse());
  } catch (Exception e) {
    throw ExceptionFactory.wrapException("Error building SqlSession.", e);
  } finally {
    ErrorContext.instance().reset();
    try {
      inputStream.close();
    } catch (IOException e) {
      // Intentionally ignore. Prefer previous error.
    }
  }
}

其它集中方法最终都是调用这两个方法实现加载配置,看两个方法的入参可以知道连个方法的唯一区别就是:上边的方法接收Reader(java.io.Reader),下边的方法接收InputStream(java.io.InputStream),两种方法均可读取配置文件。不难发现两种方法殊途同归,都是委托XMLConfigBuilder来解析xml文件从而构建SqlSessionFactory。

XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());

三、拓展:为什么使用工厂模式?

我们在各种源码中发现工厂模式满天飞,工厂模式有什么优点呢?

先了解下工厂模式

工厂方法模式包含如下角色:

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

工厂模式的时序图:

image-20200703002301754.png

工厂模式的优点:

image-20200703002318906.png
  • 工厂模式用来创建客户端所需要的产品,同时隐藏了具体创建的细节,尤其适合创建过程比较复杂的类,这样用户只需关心所需要的产品对应的工厂,无需关系关心创建细节。

  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

使用环境

  • 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

引用

简单工厂模式链接

相关文章

网友评论

    本文标题:Mybatis源码学习(1)--SqlSessionFactor

    本文链接:https://www.haomeiwen.com/subject/drahcktx.html