IOC是一種可以幫助我們解耦各業(yè)務(wù)對象間依賴關(guān)系的對象綁定方式欧募。
一压状、注入方式(通常我們會說IOC是通過DI來實(shí)現(xiàn)的,那么有哪些注入方式呢?)
- 構(gòu)造方法注入(對相同類型的參數(shù)的處理會比較困難种冬,維護(hù)和使用比較麻煩)
- setter方法注入(侵入性弱镣丑,good)
- 接口注入(退役,強(qiáng)制被注入對象實(shí)現(xiàn)不必要的接口娱两,帶有侵入性)
- 關(guān)于實(shí)現(xiàn):反射(正常注入)+CGLIB動態(tài)生成其子類(方法注入莺匠,每一次返回不同的對象)
二、IOC Service Provider的職責(zé)(抽象出來的概念十兢,可以指代任何將IOC場景中的業(yè)務(wù)對象綁定到一起的實(shí)現(xiàn)方式)
- 業(yè)務(wù)對象的構(gòu)建管理
- 業(yè)務(wù)對象間的依賴綁定
- 直接編碼的方式
- 配置文件方式
- 注解的方式
三趣竣、BeanFactory—Spring的IOC容器
- 基礎(chǔ)類型IOC容器,提供完整的IOC服務(wù)支持纪挎。如果沒有特殊指定期贫,默認(rèn)采用延遲初始化策略。
- BeanFactory异袄,Bean工廠,其實(shí)其就像一個工廠玛臂,通過“流水線”生產(chǎn)出一個個Bean烤蜕,然后管理著所有被他“生產(chǎn)”出來的Bean。
- 其實(shí)可以將BeanFactory的實(shí)現(xiàn)看作兩個階段:容器啟動階段迹冤、Bean實(shí)例化階段讽营。同時spring的IOC容器在實(shí)現(xiàn)的時候,在每個階段都加入了相應(yīng)的容器擴(kuò)展點(diǎn)泡徙,以便我們可以根據(jù)具體場景的需要加入自定義的擴(kuò)展邏輯橱鹏。
- 容器啟動階段:
- 通過某種途徑加載Configuration MetaData。
- 解析和分析堪藐,編組為相應(yīng)的BeanDefinition(每一個Bean都有一個對應(yīng)的BeanDefinition莉兰,保存著這個類的各種信息)。
- 將BeanDefinition注冊到相應(yīng)的BeanDefinitionRegistry(定義抽象了Bean的注冊邏輯礁竞,簡單來說就是hold bean definitions)糖荒,啟動工作完成。
- Bean實(shí)例化階段:
- 根據(jù)準(zhǔn)備信息模捂,就可以根據(jù)需要生產(chǎn)Bean了捶朵,BeanFactory的實(shí)現(xiàn)類負(fù)責(zé)具體Bean的注冊和管理工作。
四狂男、ApplicationContext——Spring的IOC容器
- ApplicationContext是一個更加先進(jìn)的容器综看,除了包含BeanFactory的所有功能,還進(jìn)一步拓展了基本容器的功能岖食,真實(shí)“青出于藍(lán)而勝于藍(lán)”红碑!
- 統(tǒng)一資源加載策略:spring提供了一套基于org.springframework.core.io.ResourceLoader接口的資源抽象和加載策略。
- 國際化信息支持
- 容器內(nèi)部事件發(fā)布
- 多配置模塊加載的簡化