通过源码分析,SqlSessionFactory是通过SqlSessionFactoryBuilder(建造类)建造出来的。
思考:
1、为什么要使用建造类(采用建造者模式)呢?
由于创建sqlSeesionFactory比较复杂,他其实是创建一个SqlSesseionFactory工厂;通过建造者模式创建
2、这样做有什么好处?
首先温习设计模式
工厂模式
了解SqlSessionFactoryBuilder构造SqlSeesionFactory,可以看到,最底层有2中方式构造SqlSeesionFactory
- 基于Reader
public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
try {
//
XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
return build(parser.parse());
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error building SqlSession.", e);
} finally {
ErrorContext.instance().reset();
try {
reader.close();
} catch (IOException e) {
// Intentionally ignore. Prefer previous error.
}
}
}
- 基于InputStream
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.
}
}
}
通过代码发现最终调用的XMLConfigBuilder进行实例化
---回到起点,我们这里是需要SqlSeesionFactory,通过代码发现,最终我们的SqlSessionFactory是通过
public SqlSessionFactory build(Configuration config) { return new DefaultSqlSessionFactory(config); }
生成出来的。
到此为止SqlSeesionFactory就是通过new DefaultSqlSessionFactory(Configuration config)给生成出来的。
DefaultSqlSessionFactory为默认的SqlSeesionFactory实现,其中它持有mybatis-config.xml(Configuration实例),在mybatis-config.xml中,除了有我们需要的DataSource外,还有相关其他的配置信息。所以只要持有了Configuration实例,说白了就是拥有mybatis底层的一切。
其他想到的东西无非就是通过一系列加工和装载得出。
【下一节分析:XMLConfigBuilder】如何建造需要的Configuration