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>

上面是通常項目中的配置,根據該配置分析java

1,獲取SqlSessionFactory

根據配置文件能夠得出切入點spring

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

因爲實現了FactoryBean的類,Spring建立bean的時候其實調用的是getObject()方法。該方法以下:數據庫

繼續查看afterPropertiesSet();方法mybatis

最後調用buildSqlSessionFactory();建立了sqlSessionFactoryapp

其中代理類的產生代碼片斷以下ui

對於每一個mapper的xml文件,掃描完成後,以以下的格式被放到Configuration的mapperRegistry的knownMapper存儲起來。spa

存放的是key爲dao接口的class,值爲MapperProxyFactory,經過該類使用jdk動態代理生成對應class的代理類。3d

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

相關文章
相關標籤/搜索