②在TransactionFactory transactionFactory = this.getTransactionFactoryFromEnvironment(environment);中,根据environment环境信息去获取environment对象中的TransactionFactory,这里是JdbcTransactionFactory,源码如下:
private TransactionFactory getTransactionFactoryFromEnvironment(Environment environment) { return (TransactionFactory)(environment != null && environment.getTransactionFactory() != null ? environment.getTransactionFactory() : new ManagedTransactionFactory()); }
③在tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);中,使用transactionFactory工厂类去获取Transaction,这里传了三个参数,一是environment的数据源信息,一个是隔离级别,一个是是否自动提交的标识。我们看下这个newTransaction---构造Transaction的方法源码,这个方法的实现在JdbcTransactionFactory类中:
public Transaction newTransaction(DataSource ds, TransactionIsolationLevel level, boolean autoCommit) { return new JdbcTransaction(ds, level, autoCommit); }
这里又使用了JdbcTransaction类的构造函数:
public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) { this.dataSource = ds; this.level = desiredLevel; this.autoCommmit = desiredAutoCommit; }
这样,获取到的Transaction就是JdbcTransaction。设置的信息如下,来个图看的更明白些:
④在 Executor executor = this.configuration.newExecutor(tx, execType);中,使用Transaction和execType来获取执行器,那这里的execType是啥玩意?这个就是在解析核心配置文件的
SIMPLE 就是普通的执行器;REUSE 执行器会重用预处理语句(prepared statements); BATCH 执行器将重用语句并执行批量更新。不设置时候默认使用SIMPLE,就是普通的执行器。我们这里使用的默认。
newExecutor方法源码如下: