前言:在各大論壇找mybatis和springboot/spring相互關系的文章,不是很多,想自己看下源碼分析mybatis怎么把dao解析并注冊到spring。
環(huán)境準備,org.springframework.boot系列jar饿悬,mybatis-spring-boot-starter.jar
1 先看下我們在springboot中配置mybatis的內容,springboot通過mapper-locations: classpath*:com/**/dao/**/*DAO.xml??
2 開始我們的分析聚霜,我們從MapperScannerRegistrar和ClassPathMapperScanner開始說起把(至于程序如何從啟動執(zhí)行到ClassPathMapperScanner需要自行調試了狡恬,步驟太多,說完需要掀開spring一堆堆代碼)蝎宇。它是mybatis-spring.jar的類弟劲,功能是掃描步驟1中的dao路徑并獲取到beanDefinition,即類的定義數(shù)據(jù)姥芥。
3 裝載beanDefinition各項數(shù)據(jù)兔乞,包括beanClass,即MapperFactoryBean.class撇眯。dao中接口使用的是該類承載代理類报嵌,該類實際繼承spring的FactoryBean虱咧,目的是借助getObject()熊榛,放置和存儲不同自身的bean。怎么理解腕巡?比如需要用到UserService玄坦,通常在UserService加上注解@Service是自己注冊成bean,而dao下的所有接口實際是代理類MapperProxy生成的動態(tài)代理類(下面會說到)绘沉。所以需要用spring的FactoryBean方式來實現(xiàn)煎楣。
4 dao的接口實際實例化的時機,是在完成bean觸發(fā)的车伞。在org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)開始看
5 在上一步中可以看到dao的bean執(zhí)行了doGetObjectFromFactoryBean的邏輯,執(zhí)行后會進入MapperFactoryBean的實例化了
6?MapperRegistry是什么另玖,MapperRegistry就是dao接口實際代理類生成的地方
7 總結困曙,springboot讀取mybatis的xml并解析,之后初始化實際調用mybatis的MapperRegistry谦去,最后通過MapperProxy結合JDK生成動態(tài)代理類