<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
根据配置文件能够得出切入点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
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来批量的实现映射。