环境:mybatis-spring 2.0.3
前面了解到,Mybatis将Mapper接口注册到Spring的时候,将Mapper接口生成的BeanDefiniton
的beanClass设置为MapperFactoryBean
,同时将其设置为按类型自动装配模式,此后Spring根据Mapper接口的BeanDefinition生成对象的时候,就会使用MapperFactoryBean
类的构造器创建对象
public class MapperFactoryBean<T> extends SqlSessionDaoSupport implements FactoryBean<T>
private Class<T> mapperInterface; // 具体Mapper接口类型
protected void checkDaoConfig() {
super.checkDaoConfig();
Configuration configuration = getSqlSession().getConfiguration();
if (this.addToConfig && !configuration.hasMapper(this.mapperInterface)) {
try {
configuration.addMapper(this.mapperInterface);
} catch (Exception e) {
// ...
} finally {
ErrorContext.instance().reset();
}
}
}
@Override
public T getObject() throws Exception {
return getSqlSession().getMapper(this.mapperInterface);
}
}
继承了SqlSessionDaoSupport
,如果MapperFactoryBean
使用的是自动装配模式,那么Spring就会在这里为它注入SqlSessionFactory
对象,并创建SqlSessionTemplate
public abstract class SqlSessionDaoSupport extends DaoSupport {
private SqlSessionTemplate sqlSessionTemplate;
// 通过sqlSessionTemplate获取SqlSession
public SqlSession getSqlSession() {
return this.sqlSessionTemplate;
}
// 只要有写入方法,无须属性就能注入
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (this.sqlSessionTemplate == null
|| sqlSessionFactory != this.sqlSessionTemplate.getSqlSessionFactory()) {
this.sqlSessionTemplate = createSqlSessionTemplate(sqlSessionFactory);
}
}
protected SqlSessionTemplate createSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
最终,注入到Spring中的Mapper代理对象,都会使用这个SqlSessionTemplate
进行数据库操作