一、Spring+MyBatis配置
下面是一个常见的Spring整合MyBatis的applicationContext.xml配置:
SqlSessionFactoryBean:负责解析配置文件,并实例化SqlSessionFactory和创建SqlSession
MapperScannerConfigurer:负责创建Mapper,并且注入到Spring的IOC容器中
下面我们分析SqlSession的创建.
二、SqlSessionFactoryBean
1、结构
继承体系:
字段:
public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {
private Resource configLocation;
private Configuration configuration;
private Resource[] mapperLocations;
private DataSource dataSource;
private TransactionFactory transactionFactory;
private Properties configurationProperties;
private SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
private SqlSessionFactory sqlSessionFactory;
//EnvironmentAware requires spring 3.1
private String environment = SqlSessionFactoryBean.class.getSimpleName();
private boolean failFast;
private Interceptor[] plugins;
private TypeHandler<?>[] typeHandlers;
private String typeHandlersPackage;
private Class<?>[] typeAliases;
private String typeAliasesPackage;
private Class<?> typeAliasesSuperType;
//issue #19. No default provider.
private DatabaseIdProvider databaseIdProvider;
private Class<? extends VFS> vfs;
private Cache cache;
private ObjectFactory objectFactory;
private ObjectWrapperFactory objectWrapperFactory;
// 方法略...
}
SqlSessionFactoryBean继承的3个接口都是与Spring相关的,最重要的就是FactoryBean和InitializingBean接口,这两个接口的实现负责创建SqlSessionFactory。
而类中的字段大部分都是可通过配置文件配置的属性。
2、FactoryBean和InitializingBean实现
FactoryBean接口:
//先调用afterPropertiesSet,实例化sqlSessionFactory
public SqlSessionFactory getObject() throws Exception {
if (this.sqlSessionFactory == null) {
afterPropertiesSet();
}
return this.sqlSessionFactory;
}
// 返回Bean的类型--SqlSessionFactory
public Class<? extends SqlSessionFactory> getObjectType() {
return this.sqlSessionFactory == null ? SqlSessionFactory.class : this.sqlSessionFactory.getClass();
}
//使用单例模式
public boolean isSingleton() {
return true;
}
InitializingBean接口: