Mybatis-Spring:MapperFactoryBean

环境: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进行数据库操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。