使用mybatis的时候会配置sqlSessionFactoryBean,将数据源传入。我对于mybatis的理解是当 处理持久层的请求时,ThreadLocal 内会持有一个数据源的jdbc 链接。这样 该线程的所有数据操作都是用一个链接来操作。完后关闭链接。debug的目的是看下到底是怎么做的。
SqlSessionFactoryBean内有很多对象,debug下来发现最关键是configuration对象。他持有用户配置的datasource。在afterPropertiesSet()方法中打上断点。
public void afterPropertiesSet() throws Exception {
notNull(dataSource, "Property 'dataSource' is required");
notNull(sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required");
state((configuration == null && configLocation == null) || !(configuration != null && configLocation != null),
"Property 'configuration' and 'configLocation' can not specified with together");
this.sqlSessionFactory = buildSqlSessionFactory();
}
启动程序 进入断点
这个方法调用过程是spring创建bean的过程。
进入buildsqlSessionFactory(),很长,主要内容是通过配置来初始化configuration。然后通过configuration来创建一个sqlSessionFactory。
protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
Configuration configuration;
//删除配置代码
if (this.transactionFactory == null) {
this.transactionFactory = new SpringManagedTransactionFactory();
}
//删除配置代码
configuration.setEnvironment(new Environment(this.environment, this.transactionFactory, this.dataSource));
//删除配置代码
return this.sqlSessionFactoryBuilder.build(configuration);
}
最后sqlSessionFactoryBuilder.build new了一个DefaultSqlSessionFactory。顾名思义他的作用就是sqlSession的创建工厂
创建的sqlSession内持有Environment对象,内含我们配置的datasource 和TransactionFactory
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean