标签:模式 exception 安全 int man spring environ 单例模式 解析
本文讨论 Spring 与 MyBatis 的整合。
在 beans.xml 中我们定义了两个 bean: SqlSessionFactoryBean、SqlSessionTemplate。
1、SqlSessionFactoryBean 是 FactoryBean,它在 Spring 容器中返回 SqlSessionFactory bean。
a、单例模式,通过 getObject() 返回,源码如下:
可以看出,SqlSessionFactoryBean 对 sqlSessionFactory 是懒加载。
b、afterPropertiesSet() 源码如下:
afterPropertiesSet() 先检查 dataSource、sqlSessionFactoryBuilder 是否为 null。
dataSource 在 beans.xml 中设置,sqlSessionFactoryBuilder 在新建 sqlSessionFactoryBean 时会自动创建。
c、protected SqlSessionFactory buildSqlSessionFactory() throws Exception;
这个方法设置了 transactionFactory (默认为 SpringManagedTransactionFactory),生成 environment,放入 configuration 中。
然后对 mapperLocations(Resource[]) 进行解析,放入 configuration 的 mappedStatements 中。
最后调用 sqlSessionBuilder.build(configuration) 返回 sqlSessionFactory。
d、在 beans.xml 中给 SqlSessionFactoryBean 设置了 dataSource、mapperLocations 两个参数。
2、SqlSessionTemplate 构造方法接收一个 SqlSessionFactory 参数,最终会调用以下的构造方法:
SqlSessionTemplate 可以加入到 Spring 的事务中,且线程安全,而 DefaultSqlSession 没有这两个特性。
3、DAO 层对数据库的访问最后都被 SqlSessionInterceptor 拦截。
这里用到了 JDK 反射功能。
标签:模式 exception 安全 int man spring environ 单例模式 解析
原文地址:https://www.cnblogs.com/huangzejun/p/8884542.html