從字面來理解是兩個概念撬码,IOC 和容器儿倒。
容器:
IOC容器屬于 Spring core 模塊,是用來創(chuàng)建和管理 Bean 的地方呜笑,以單例的方式存儲 Bean夫否,具體存儲的地方:
DefaultListableBeanFactory 的 beanDefinitionMap
以ConcurentHashMap 的形式存儲了 BeanDefinition 對象,該對象封裝了 Spring 對 一個Bean 所有信息的定義叫胁,包括 類名凰慈,屬性,構(gòu)造方法參數(shù)曹抬,依賴溉瓶,是否延遲加載,是否單例等谤民,之后對 Bean 的操作都是直接對它進行的堰酿。
IOC容器的初始化分三個步驟:
- BeanDefinition 的資源定位
- BeanDefinition 的資源的載入和解析
- BeanDefinition 的注冊
我們經(jīng)常從 BeanFactory 實例化 Bean 開始說 Bean的生命周期,而 BeanFactory 就是在第二個步驟被構(gòu)造出來的张足。
IOC:
Inversion of Control触创,控制反轉(zhuǎn)。
我們依舊從字面來理解为牍,控制和反轉(zhuǎn)哼绑。
一般我們需要一個對象的時候,都是直接通過 new 的方式創(chuàng)建碉咆,這個時機是由我們把握的抖韩。也就是說我們什么時候想要這個資源,我們就主動拿疫铜,這個控制權(quán)在我們手上∶。現(xiàn)在這個控制權(quán)交給 IOC容器了,我們通過聲明的方式表達我們想要的想法壳咕,但這個資源的創(chuàng)建和發(fā)放席揽,都是 IOC容器控制的。
反轉(zhuǎn)的概念在哪呢谓厘,Spring 框架幌羞,說到底也只不過是個工具,編譯后也是以第三方包的形式存在代碼中竟稳,以前都是我們使用工具包直接獲取資源属桦,現(xiàn)在反轉(zhuǎn)了熊痴,我們能不能獲取這個資源工具包說了算。
DI:
Dependency Injection地啰,依賴注入愁拭,我們依賴 IOC容器注入資源(對象)。
DI 是 IOC容器實現(xiàn)控制反轉(zhuǎn)的方式亏吝,有三種,這里就不詳述了盏混。
DI 是如何實現(xiàn)解耦的蔚鸥?
開發(fā)中,我們經(jīng)常在 控制層 調(diào)用 業(yè)務層 接口许赃,沒有實現(xiàn)具體類止喷,通過接口對象直接調(diào)業(yè)務方法。但是運行時的時候混聊,IOC容器就動態(tài)調(diào)用了對應實現(xiàn)類的方法弹谁。我們只需要通過 @Autowired 注入業(yè)務的最上層接口,只關(guān)心使用句喜,不用關(guān)心具體的業(yè)務實現(xiàn)预愤。達到了解耦的效果。