mybatis中工厂模式深入理解
抽象工厂模式定义
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
mybatis中的工厂模式主要是通过:
SqlSessionFactory
SqlSessionFactoryBuilder
来实现的
1.代码
1.1文字版
1.new SqlSessionFactoryBuilder().build(resourceAsStream);
2.build方法根据参数输入流resourceAsStream生成Xmlconfigration
3.调用SqlSessionFactoryBuilder的build(Configration config)方法返回DefaultSqlSessionFactory(SqlSessionFactoryBuilder的一个实现的工厂类)
4.SqlSessionFactory.openSession();
5.调用的是DefaultSqlSessionFactory重写了的opensession方法: openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
6.最后返回DefaultSqlSession var8;中的var8,其实就是SqlSession的实现类DefaultSqlSession
说明:重点解释一下被===========围住的代码
public class MybatisUtils {
private static SqlSessionFactory build = null;
static {
try {
InputStream is = Object.class.getResourceAsStream("/database.properties");
Properties properties = new Properties();
properties.load(is);
String property = properties.getProperty("mybatis.config");
InputStream resourceAsStream = Resources.getResourceAsStream(property);
//=================================================
build = new SqlSessionFactoryBuilder().build(resourceAsStream);
//=================================================
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession() {
if (build == null) {
throw new RuntimeException();
}
//=================================================
return build.openSession();
//=================================================
}
}
2.流程如下(以源码形式展开)
跟随注解//xxxxxxxxxxxxxxxx数字顺序观看
public SqlSessionFactory build(InputStream inputStream) {
//111111111111111111111111111111111111111111
return this.build((InputStream)inputStream, (String)null, (Properties)null);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
//2222222222222222222222222222222
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
}
}
return var5;
}
public SqlSessionFactory build(Configuration config) {
//333333333333333333333333333333333
return new DefaultSqlSessionFactory(config);
}
public DefaultSqlSessionFactory(Configuration configuration) {
//44444444444444444444444444444444
this.configuration = configuration;
}
public SqlSession openSession() {
//555555555555555555555555555555555这里三个参数分别为执行器,事务隔离级别,是否自动提交
return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);
}
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
DefaultSqlSession var8;
try {
Environment environment = this.configuration.getEnvironment();
TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
Executor executor = this.configuration.newExecutor(tx, execType);
//6666666666666666666666666666666666666
var8 = new DefaultSqlSession(this.configuration, executor, autoCommit);
} catch (Exception var12) {
this.closeTransaction(tx);
throw ExceptionFactory.wrapException("Error opening session. Cause: " + var12, var12);
} finally {
ErrorContext.instance().reset();
}
return var8;
}
//777777777777777777777777777777777
public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) {
this.configuration = configuration;
this.executor = executor;
this.dirty = false;
this.autoCommit = autoCommit;
}
最后就返回了创建的session对象