zoukankan      html  css  js  c++  java
  • mybatis--MapperScannerConfigurer

    一般我们这样配置

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
    lazy-init="false">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath:sqlmapper/*Mapper.xml"/>
    <property name="plugins">
    <list>
    <bean class="***">
    <property name="dialect">
    <bean class="***"/>
    </property>
    </bean>
    </list>
    </property>
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="*.*.*" />
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        </bean>

    内部使用 ClassPathMapperScanner 来扫描包下面的mapper接口,每个接口构建一个BeanDefinitionHolder(beanclass为MapperFactoryBean)

    当需要mapperinterface实例时,由MapperFactoryBean工厂产生

    public T getObject() throws Exception {
            return this.getSqlSession().getMapper(this.mapperInterface);
        }

    可以吧this.getSqlSession()看做是sqlSessionFactory的封装SqlSessionTemplate,实际调用

    public <T> T getMapper(Class<T> type) {
    return this.getConfiguration().getMapper(type, this);
    }

    这里的this.getConfiguration()实际是

    return this.sqlSessionFactory.getConfiguration();

    走到这步,就必须来看SqlSessionFactoryBean做了什么吧?关键方法如下:

    protected SqlSessionFactory buildSqlSessionFactory() throws IOException {
        XMLConfigBuilder xmlConfigBuilder = null;
        Configuration configuration;
        ..................
         if(this.transactionFactory == null) {
                this.transactionFactory = new SpringManagedTransactionFactory();
         }
    
         Environment var29 = new Environment(this.environment, this.transactionFactory, this.dataSource);
         configuration.setEnvironment(var29);
       ...............       
    
            if(!ObjectUtils.isEmpty(this.mapperLocations)) {
               XMLMapperBuilder e = new XMLMapperBuilder(var33.getInputStream(), configuration, var33.toString(), configuration.getSqlFragments());
               e.parse();
            }
            return this.sqlSessionFactoryBuilder.build(configuration);
    }

    红色部分,设置configuration->environment->springManagedTransactionFactory

    XMLMapperBuilder 详细过程见 mybatis缓存创建过程 ,parse中xml的namespace相应的class注册给configuration

    public <T> void addMapper(Class<T> type) {
    this.mapperRegistry.addMapper(type);
    }

    最后的return调用 SqlSessionFactoryBuilder

    public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
    }

    这里的Configuration对象很关键

    总结如下:org.mybatis.spring.SqlSessionFactoryBean解析mapper xml配置,根据namespace添加class mapper组装Configuration对象,包装为DefaultSqlSessionFactory;

    org.mybatis.spring.mapper.MapperScannerConfigurer扫描basePackage下的mapper接口,封装为MapperFactoryBean注册给spring容器,当调用"mapper接口"时去DefaultSqlSessionFactory-》Configuration获得接口类的代理类

    MapperProxy mapperProxy = new MapperProxy(sqlSession, this.mapperInterface, this.methodCache);

    进一步的调用过程见 mybatis缓存

    如何在调用中事务起作用,见下篇

  • 相关阅读:
    Linux的chattr与lsattr命令详解
    ls命令
    linux PS1
    which,whereis,locate,find
    linux下的文件结构
    Linux各种命令
    PHP将两个二维数组合并为一个二维数组的方法
    vagrant virtualbox VM inaccessible解决办法
    常用Mysql查询语句
    删除数组元素并重建索引的方法
  • 原文地址:https://www.cnblogs.com/yhzh/p/5587465.html
Copyright © 2011-2022 走看看