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