一、什么是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)很累)纱烘。如果有錯誤及時告知或者歡迎糾錯杨拐。