Spring整合Mybatis原理简单分析

  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- 配置数据库表对应的java实体类 -->
        <property name="typeAliasesPackage" value="com.test.pojo" />
        <!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
        <property name="mapperLocations" value="classpath:com/test/mapping/*.xml" />
    </bean>
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.test.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
    </bean>

上面是一般项目中的配置,根据该配置分析

1,获取SqlSessionFactory

根据配置文件可以得出切入点

public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> {}

由于实现了FactoryBean的类,Spring创建bean的时候其实调用的是getObject()方法。该方法如下:

继续查看afterPropertiesSet();方法

最后调用buildSqlSessionFactory();创建了sqlSessionFactory

其中代理类的产生代码片段如下

对于每个mapper的xml文件,扫描完成后,以如下的格式被放到Configuration的mapperRegistry的knownMapper存储起来。

存放的是key为dao接口的class,值为MapperProxyFactory,通过该类使用jdk动态代理生成对应class的代理类。

 Spring的bean与Mybatis的Mapper之间的映射 ---MapperFactoryBean与MapperScannerConfigurer

MapperFactoryBean这个类的作用是:

将传统Mybatis调用数据库的方式:

xxxMapper mapper = sqlSession.getMapper(xxxMapper.class);

变成

xxxMapper mapper = context.getBean(“xxxMapper”);

也就是将mybatis的对象由spring以bean的方式管理

形成了一一对应关系,方便在service层直接注入使用。

当mapper文件数量多的时候,使用MapperFactoryBean显得很繁琐,因此spring提供了org.mybatis.spring.mapper.MapperScannerConfigurer来批量的实现映射。

原文地址:https://www.cnblogs.com/ljdblog/p/7121492.html