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缓存

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

  • 相关阅读:
    js对象数组(JSON) 根据某个共同字段 分组
    一个 函数 用来转化esSearch 的range 条件
    关于 vuex 报错 Do not mutate vuex store state outside mutation handlers.
    android listview 重用view导致的选择混乱问题
    android SDK和ADT的更新
    Android中adb push和adb install的使用区别
    pycharm中添加扩展工具pylint
    su Authentication failure解决
    Putty以及adb网络调试
    有关android源码编译的几个问题
  • 原文地址:https://www.cnblogs.com/yhzh/p/5587465.html
Copyright © 2011-2022 走看看