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來批量的實現映射。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM