当mybatis调用动态代理的时候,会调用MapperProxy的invoke方法,但是先来看下当DefaultSqlSessionFactory在openSession的时候做了什么事情,如图1:
图1:
这里涉及到两个方法openSessionFromDataSource和openSessionFromConnection,看下分别做了什么事情,如图2:
图2:
调用getTransactionFactoryFromEnvironment获取事务工厂,如果在配置的时候没有实现,那么就用默认的,返回的是ManagedTransactionFactory,如图3:
图3:
但是,在配置后初始化的时候,一般都会设置,而且一般是设置成JDBC,如图4:
图4:
那么在Enviroments初始化的时候已经加载了默认的事务工厂,Configuration也预先帮我们加载了两个事务工厂类,如图5:
图5:
在看下Enviroments初始化,如图6:
图6:
那么接着往下看,在获取了事务工厂以后,通过调动transactionFactory.newTransaction实例化事务,可以设置隔离级别和是否自动事务,如图7:
图7:
看下隔离级别有哪些,提供了6种,我就不做解释了,如图8:
图8:
在调用Configuration来生成执行器,如图9:
图9:
通过上面几步,就生成了一个DefaultSqlSession。
openSessionFromConnection和openSessionFromDataSource差不多,只是openSessionFromConnection使用的Connection来获取DefaultSqlSession。
如有不对,请指出,共同进步,谢谢!