IOC容器是什么?
ioc其實(shí)是控制反轉(zhuǎn)的縮寫(xiě),它是一種廣泛應(yīng)用的編程思想空镜。在javaweb中的ioc容器幫助我們解決了很多的問(wèn)題,讓我們的開(kāi)發(fā)更加的便捷捌朴,并且實(shí)現(xiàn)了松耦合吴攒。
IOC思想就是將創(chuàng)建bean的關(guān)系不在互相依賴自己所在的類,也就是在一個(gè)bean中去new 我們的實(shí)現(xiàn)類砂蔽。當(dāng)業(yè)務(wù)變更時(shí)需要對(duì)代碼進(jìn)行侵入式的修改洼怔。而使用IOC容器的話,我們將創(chuàng)建bean的任務(wù)交給IOC容器去管理左驾。我們只需要用的時(shí)候到IOC容器之中去取即可镣隶,我們使用xml或者注解等配置文件的方式實(shí)現(xiàn)對(duì)bean的管理。
IOC的兩種實(shí)現(xiàn)方式
1.BeanFactory 是IOC的初級(jí)形式什荣,只實(shí)現(xiàn)了IOC容器的基本實(shí)現(xiàn)矾缓。他沒(méi)有集成Resource類去讀取配置文件,沒(méi)有集成BeanDefinitionReader(根據(jù)配置文件封裝bean信息的類)等等稻爬。
2.ApplicationContext 可以自己根據(jù)不同的實(shí)現(xiàn)類去自動(dòng)的讀取配置文件或者掃描注解進(jìn)行bean的生成嗜闻,在getBean時(shí)觸發(fā)依賴注入。常見(jiàn)的實(shí)現(xiàn)類有FileSystemxmlApplicationContext(根據(jù)文件路徑讀取配置文件)桅锄,ClasspathApplcationContext(到項(xiàng)目的根目錄下讀取配置文件)琉雳,WebApplicationContext(從web容器中讀取配置文件)
當(dāng)然無(wú)論是IOC容器的初級(jí)形式還是高級(jí)形態(tài),都是為了管理bean的友瘤。beanfactory是完成了對(duì)于IOC容器最基本的定義翠肘,他不會(huì)去自動(dòng)的裝載我們的配置,也不會(huì)去自動(dòng)解析我們的配置文件辫秧。這些都是由另外的類負(fù)責(zé)完成的束倍,beanfactory只定義了一些基礎(chǔ)的方法例如getBean()這種方法,他也是依賴注入的觸發(fā)點(diǎn)盟戏。
這一部分的一些小Tips:
1.在factorybean中利用轉(zhuǎn)義符號(hào)"&"來(lái)獲取factorybean本身
2.并不是所有的bean都是在getBean時(shí)觸發(fā)依賴注入完成對(duì)bean的初始化绪妹,在我們配置文件中指定lazy-init
可以在容器加載完成后就初始化改bean
3.在構(gòu)造方法中的refresh方法會(huì)觸發(fā)對(duì)一個(gè)容器的初始化
4.IOC容器初始化的步驟Resouce類進(jìn)行①定位②載入③注冊(cè) 然后將dom解析器解析出來(lái)的數(shù)據(jù)轉(zhuǎn)換成
springIOC容器通用的數(shù)據(jù)結(jié)構(gòu)BeanDefinition(其實(shí)最后是一個(gè)并發(fā)的hashmap持有該數(shù)據(jù)),并且將數(shù)據(jù)封裝到holder中去
5.如果一個(gè)bean中有同名的property設(shè)置,那么第二個(gè)將不會(huì)進(jìn)行解析柿究,直接跳過(guò)邮旷,起作用的只有第一個(gè)。
6.Spring中有多種beanfactory蝇摸,他們都有不同的實(shí)現(xiàn)方式婶肩,有的實(shí)現(xiàn)了可以設(shè)置雙親父容器办陷,可以從中取
出bean,當(dāng)然是優(yōu)先從當(dāng)前容器中取律歼,找不到一直向上追溯父容器鏈直到找到為止
初始化bean的步驟
1.populatebean 完成bean的依賴注入
2.initializeBean 初始化bean
3.applyBeanPostProcessorsBefore
如果實(shí)現(xiàn)了initializingBean接口的話民镜,會(huì)檢查一系列的接口。緊接著會(huì)調(diào)用bean是否有initMethod方法苗膝,如果有的話調(diào)用該方法進(jìn)行初始化殃恒。
關(guān)于bean的創(chuàng)建方式,使用的是strategy類辱揭,如果使用構(gòu)造器初始化的話,使用jdk的動(dòng)態(tài)代理病附,如果其他的初始化方式的話使用的是cglib方式的動(dòng)態(tài)代理问窃。