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-
工厂模式用来创建客户端所需要的产品,同时隐藏了具体创建的细节,尤其适合创建过程比较复杂的类,这样用户只需关心所需要的产品对应的工厂,无需关系关心创建细节。
-
通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
使用环境
- 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
引用
简单工厂模式链接
网友评论