Mybatis是怎么和Spring整合的

????????讀完本文后你的收獲:

? ? ????????????1速挑、了解Mybatis和Spring整合的底層原理

? ? ? ? ????????2、知道為什么我們在spring中定義了接口就可以直接操作數(shù)據(jù)庫

? ? ? ????????? 3副硅、了解Spring中的拓展點和FactoryBean的使用

? ? ? ? 首先來分析要解決的問題姥宝,如下圖所示恐疲,我們沒有在Admapper上加@Component等注解腊满,我們?yōu)槭裁纯梢詮腷ean工廠中獲取AdMapper的實例培己,并且可以通過@Resource注入對象;

AdService

? ? ? ? 首先來解決第一個問題碳蛋,沒有加注解是怎么加入到容器中的。

? ? ? ? 在mybatis和spring整合時省咨,一般會在配置類上加@MapperScan,我們點進(jìn)去這個注解發(fā)現(xiàn)茸炒,它@Import(MapperScannerRegistrar.class)了另一個類愕乎。MapperScannerRegistrar這個類呢做的就是把所有的mapper變成BeanDefinition壁公,從而后邊可以被創(chuàng)建感论。

繼承關(guān)系

? ? ? ? 通過繼承關(guān)系紊册,我們發(fā)現(xiàn)這個類實現(xiàn)了ImportBeanDefinitionRegistrar這個接口比肄,這個接口是spring當(dāng)中的一個擴(kuò)展點,基于接口中的registerBeanDefinitions方法我們可以做到向bean工廠中注入BeanDefinition囊陡。

doScan

? ? ? ? 看一下這個方發(fā)的實現(xiàn),主要是doScan方法撞反,首先調(diào)用父類的doScan掃描我們配置的包路徑妥色,獲得所有的class遏片,包裝成BeanDefinition嘹害,假如說我們這些接口都有實現(xiàn)類撮竿,那么這時我們把這個BD直接放入到BDMap中笔呀,spring就會幫助我們創(chuàng)建對象幢踏,這就解釋了第一個疑問,這些接口的定義信息是怎么放進(jìn)去的房蝉。

? ? ? ? 我們雖然拿到了BD并且把它放到了BDMap中去,如果spring直接使用當(dāng)前的bd是沒辦法創(chuàng)建成功對象的微渠,因為我們只寫了接口搭幻,這時我們就要改變BeanDefinition的屬性敛助,來讓bean工廠可以創(chuàng)建對象粗卜。

? ??????processBeanDefinitions方法就是做的這個事纳击,我們看到這個方法的接口參數(shù)是Set<BeanDefinitionHolder> beanDefinitions续扔,也就是上一步掃描的結(jié)果,循環(huán)修改BD的信息

? ? ? ? 主要解析以下三行代碼

? ? ? ?代碼1: definition.getPropertyValues().add("mapperInterface", definition.getBeanClassName());

? ? ? ?代碼2:?definition.setBeanClass(this.mapperFactoryBean.getClass());

? ?????代碼3:?definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);

? ? ? ? 解析代碼直接焕数,因為 它設(shè)置了一個mapperFactoryBean,所以需要知道m(xù)apperFactoryBean的結(jié)構(gòu)


MapperFactoryBean.java

? ? ? ? 可以看到MapperFactoryBean實現(xiàn)了繼承了 SqlSessionDaoSupport 實現(xiàn)了FactoryBean堡赔;FactoryBean這個接口大家都不陌生识脆,可以通過getObject方法獲得我們想要的對象善已,實時上也是這么做的灼捂。

? ? ? ? ? ? 代碼一? ?definition.getPropertyValues().add("mapperInterface", definition.getBeanClassName());此處相當(dāng)于我們直接調(diào)用setMapperInterface方法,只不過是spring會把字符串轉(zhuǎn)換成class對象悉稠,為什么要設(shè)置class類型,因為我們的mapper通常有好多接口艘包,而且我們也不知道具體的名字的猛,需要程序動態(tài)的注入進(jìn)來想虎;? ? ?

? ??????????代碼2:?definition.setBeanClass(this.mapperFactoryBean.getClass());設(shè)置bd的beanClass類型卦尊,bd在創(chuàng)建的時候會根據(jù)這個類型去創(chuàng)建對象舌厨,因為mapperFactoryBean是個對象岂却,所以可以被創(chuàng)建。

? ??????????代碼3:?definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); 修改默認(rèn)的裝配類型為byType,這樣我們就可以通過@Autowired來自動裝配

? ? ? ? ? ? 到現(xiàn)在實際上已經(jīng)把bd的定義修改完了煌恢,然后在創(chuàng)建對象時回調(diào)用getObject方法生成代理對象骇陈,并放到容器中震庭。所以容器中放的是接口的代理對象。那么我們也可以直接拿出來使用

? ? ? ? ? ? 上邊已經(jīng)對文章開頭處的疑問做了闡述器联,希望能對大家有所幫助,其實還有很多細(xì)節(jié)比如為什么要設(shè)置AutowireMode婿崭,不設(shè)置會怎么樣,大家可以查看一下源碼去解決這個問題氓栈,并且會很有收獲發(fā)現(xiàn)spring默認(rèn)的裝配類型不是按類型裝配渣磷。

? ? ? ? ? ? 再次總結(jié)一下文章中所用的知識點

????????????ImportBeanDefinitionRegistrar:這個接口可以幫助我們動態(tài)的向bean工廠中添加bd或者修改bd

????????????FactoryBean:這個接口可以讓我們通過getObject方法獲取對象并且執(zhí)行是不是單例? ? ? ? ? ??

? ??????????AutowireMode:裝配類型,可以實現(xiàn)自動裝配

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末醋界,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子提完,更是在濱河造成了極大的恐慌形纺,老刑警劉巖徒欣,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逐样,死亡現(xiàn)場離奇詭異打肝,居然都是意外死亡脂新,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門争便,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人楼吃,你說我怎么就攤上這事始花『⑽” “怎么了酷宵?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浇垦。 經(jīng)常有香客問我,道長荣挨,這世上最難降的妖魔是什么男韧? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮此虑,結(jié)果婚禮上甚纲,老公的妹妹穿的比我還像新娘朦前。我一直安慰自己介杆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布韭寸。 她就那樣靜靜地躺著,像睡著了一般恩伺。 火紅的嫁衣襯著肌膚如雪赴背。 梳的紋絲不亂的頭發(fā)上晶渠,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天凰荚,我揣著相機(jī)與錄音,去河邊找鬼乱陡。 笑死,一個胖子當(dāng)著我的面吹牛憨颠,可吹牛的內(nèi)容都是我干的胳徽。 我是一名探鬼主播爽彤,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼养盗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了适篙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嚷节,失蹤者是張志新(化名)和其女友劉穎聂儒,沒想到半個月后硫痰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衩婚,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年非春,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡奇昙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出储耐,到底是詐尸還是另有隱情羊初,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布凳忙,位于F島的核電站业踏,受9級特大地震影響禽炬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腹尖,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伐脖。 院中可真熱鬧热幔,春花似錦讼庇、人聲如沸绎巨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歼跟,卻和暖如春和媳,著一層夾襖步出監(jiān)牢的瞬間哈街,已是汗流浹背留瞳。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留骚秦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓作箍,卻偏偏與公主長得像硬梁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子靶溜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容