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