#Spring的IoC的原理Demo

一、什么是IoC

IoC控制反轉(zhuǎn)捻勉,由spring來創(chuàng)建對象并進行對象裝配权她,解決類與類之間的耦合

二虹茶、Demo開始逝薪,我們創(chuàng)建一個自動裝配的的類模擬IoC的功能

1、spring中包掃描@Service能在spring容器中創(chuàng)建bean蝴罪,首先我們定義自己的@MyService

2董济、spring中的@Autowirted能自動裝配,我們定義自己的@MyIoc

3要门、spring中用ClassPathXmlApplicationContext進行加載xml文件虏肾,我們定義一個自己的類,構(gòu)造方法需要一個包名字符串欢搜。


4封豪、首先我們看構(gòu)造方法,會進行創(chuàng)建一個map來充當bean的容器和一個cacheField的map來充當一個裝有@MyIoc注解的變量炒瘟,后面我們會用到吹埠,這里不明白也沒關系。

我們看newInstance()方法疮装,這里我將放進來的包名進行一個工具類的執(zhí)行藻雌,像spring中的@CompontScan進行包掃描得到包下面所有的類的字節(jié)碼(該字節(jié)碼是一個以類名稱首字母小寫為key的map)并將字節(jié)碼賦值給成員變量,有興趣的童鞋可以問我要源碼自己看一下斩个。這里我們主要講IoC胯杭。

然后我們可以看到循環(huán)走doCreateBean()方法跟spring中的方法盡量保持同名稱方便理解,進行一個創(chuàng)建bean的過程受啥,接下來我們看doCreateBean()方法

在該方法中主要三大方法進行做个,在三大方法之前會對beans(就是成員變量中的map)進行一個獲取是否創(chuàng)建過該bean跟spring中一樣,toFirstSmll()方法是進行將名稱首字母變成小寫滚局。然后走三大方法居暖,第一個方法Instance()是創(chuàng)建bean的方法也就是通過反射進行創(chuàng)建對象(注意spring中是無參構(gòu)造進行的創(chuàng)建對象,我這里為了方便)藤肢,第二個方法是apply()是進行將該對象中的所有的加了我們定義的@MyIoc注解的變量裝入到一個以類名稱首字母小寫為key的太闺,value為list的map中(該map就是我們成員變量中的cacheField),接下來我們看第三個方法init()方法嘁圈,該方法就是對創(chuàng)建好的對象進行bean的自動裝配省骂。

5、首先我們第一個方法Instance()最住,toFirstSmll()方法就是對名稱進行一個首字母小寫的變化钞澳,后面就不再解釋≌歉浚可以看到直接創(chuàng)建對象并以類名稱首字母小寫的方式放入beans中轧粟,為了創(chuàng)建對象時先進行判斷是否創(chuàng)建過因為我們會遞歸這個doCreateBean()方法,注意spring中默認是無參構(gòu)造創(chuàng)建的,再次強調(diào)兰吟。

6通惫、接著我們第二個方法apply(),該方法是獲取類的所有變量并進行循環(huán)訪問是否有@MyIoc注解混蔼,有個話裝進list中讽膏,最終放入cacheField的map中緩存起來,以類首字母小寫的姓氏拄丰。

7府树、最后init()方法,我們看到首先回去cacheField中進行找到該bean的緩存好的所有變量的list料按,如果該list為null則說明這個類并沒有加@MyIoc的注解的變量則什么也不做奄侠。有的話則進行查找beans容器中是否有該需要注入的類對象,沒有也就會重新走doCreateBean()方法再次對類進行創(chuàng)建對象和初始化载矿,也就是說我們創(chuàng)建一個bean的時候可能會去創(chuàng)建另一個bean垄潮,那到創(chuàng)建這個bean的時候怎么辦我們對doCreateBean()方法中第一個就去判斷是否創(chuàng)建過該bean。走完doCreateBean()方法闷盔,beans容器中也就有了該bean并對它進行注入弯洗。整個注入完后對該bean的緩存有@MyIoc注解變量list進行移除也就是最后的cacheFidle.remove(name);

這是getBean()方法和toFirstSmll()方法


注意逢勾!注意牡整!注意!

@MyIoc的變量名必須必須和類名保持一致并且首字母小寫溺拱,因為我寫死了

二逃贝、最后總結(jié)

也就是創(chuàng)建實例,緩存其中的注解變量迫摔,初始化實例沐扳。

在整個的一個bean創(chuàng)建的過程中有可能去創(chuàng)建另一個bean,所有在創(chuàng)建bean之前就判斷是否創(chuàng)建過該bean句占。

想要了解該工具類如何做到spring中的包掃描問我要源碼

想要源碼參考的關注加留言郵箱沪摄!qq1820571641,記得關注(原創(chuàng)很累)纱烘。如果有錯誤及時告知或者歡迎糾錯杨拐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凹炸,隨后出現(xiàn)的幾起案子戏阅,更是在濱河造成了極大的恐慌,老刑警劉巖啤它,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡变骡,警方通過查閱死者的電腦和手機离赫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塌碌,“玉大人渊胸,你說我怎么就攤上這事√ㄗ保” “怎么了翎猛?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長接剩。 經(jīng)常有香客問我切厘,道長,這世上最難降的妖魔是什么懊缺? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任疫稿,我火速辦了婚禮,結(jié)果婚禮上鹃两,老公的妹妹穿的比我還像新娘遗座。我一直安慰自己,他們只是感情好俊扳,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布途蒋。 她就那樣靜靜地躺著,像睡著了一般馋记。 火紅的嫁衣襯著肌膚如雪碎绎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天抗果,我揣著相機與錄音筋帖,去河邊找鬼。 笑死冤馏,一個胖子當著我的面吹牛日麸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逮光,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼代箭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涕刚?” 一聲冷哼從身側(cè)響起嗡综,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杜漠,沒想到半個月后极景,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體察净,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年盼樟,在試婚紗的時候發(fā)現(xiàn)自己被綠了氢卡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晨缴,死狀恐怖译秦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情击碗,我是刑警寧澤筑悴,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站稍途,受9級特大地震影響阁吝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晰房,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一求摇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殊者,春花似錦与境、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至海蔽,卻和暖如春共屈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背党窜。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工拗引, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幌衣。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓矾削,卻偏偏與公主長得像,于是被迫代替她去往敵國和親豁护。 傳聞我的和親對象是個殘疾皇子哼凯,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354