Spring01——SpringIoC容器
一、spring概述
spring就是一種基於bean的程式設計,主要是配置bean。spring技術不是為了取代所有技術,而是提供更好的整合模板使他們能夠整合到spring技術上來。而spring框架也是無侵入性或者地侵入性的(即即使Java應用離開了spring依舊可以運用),擁有即拔即插的功能。
二、springIoC闡述
IoC(控制反轉)是一個比較抽象的概念,我舉個例子,比如你現在要吃蛋炒飯,你除了得準備蛋和飯等等還必須會自己炒,這就是你對需要的東西的主動建立,而控制反轉則反過來了,它可以看成是被動建立的過程,比如同樣你是要吃 蛋炒飯 ,你可以直接開啟 美團外賣裡的商家 通過 你的描述 點餐,然後它送到 你的地址 給你,這樣你無須知道怎麼蛋炒飯怎麼製作的,但你一樣吃到了蛋炒飯,全程你也不需要知道蛋炒飯的製作流程。或者在團隊中,你可能熟悉商品的交易流程,對財務你不怎麼熟悉,而團隊其他人熟悉,這麼一來,可以由 熟悉財務流程的成員 開發對應的 介面 ,介面邏輯儘量簡單,內容多複雜你也不需要管,你只要通過簡單地 描述 呼叫介面就能使用了。 這裡可做類比:蛋炒飯就相當於財務介面,而美團外賣裡的商家就相當於熟悉財務流程的同事,你對蛋炒飯的描述和地址就等同於獲取財務介面例項的描述。 當我們對某一領域不精通,這個時候我們可以把建立物件的主動權轉交給別人,這就是控制反轉的概念。
控制反轉是一種通過描述(在Java中可以是XML或者註解)並通過第三方去產生或獲取特定物件的方式。比如上方我們只需要知道美團外賣可以點我想要的蛋炒飯,而不需要去理解怎麼建立蛋炒飯的。 它最大的好處在於降低了物件之間的耦合 。主動建立模式下,責任歸於開發者,被動建立模式下,責任歸於springIoC容器。 springIoC容器的主要2功能是:①容納bean;②提供bean。
springIoC容器的設計是基於BeanFactory和ApplicationContext兩個介面 ,其中BeanFactory是springIoC容器所定義的最底層介面。大多數場景下,都會使用ApplicationContext作為springIoC容器。
BeanFactory介面原始碼分析:
getBean()的多個方法用於獲取配置給springIoC容器的Bean;
isSingleton()用於判斷是否單例,若為true則該bean是容器的唯一單例;
isPrototype()則相反,即為false時,你從容器中獲取bean,容器會為你生成一個新的例項;

用程式碼舉個例子:
先建立一個實體POJO類

POJO類
再建立一個果汁製作者類

makeJuice
建立spring-cfg配置檔案管理bean

最後寫個測試類呼叫

執行效果:

就這樣,通過spring配置我們很靈活的就完成物件的建立使用而不是通過new物件的方式來實現,實現瞭解耦合的效果。
三、springIoC容器的初始化和依賴注入
注意, bean的定義和初始化在springIoC容器中是兩大步驟, 先定義,然後才初始化和依賴注入的。
bean定義分三步:
①Resource定位:在spring的開發中,通過XML或者註解都是常見的方式,定位的內容是由開發者所提供的。
②BeanDefinition的載入:這時候只是將Resource定位到的資訊,儲存到BeanDefinition中,並不會建立bean例項。
③BeanDefinition的註冊:這個過程就是將BeanDefinition的資訊釋出到springIoC容器中,注意此時仍然沒有對應的bean例項建立。
做完以上三步bean就在springIoC容器定義了,但沒有被初始化,更沒有依賴注入,也就沒有諸如其配置的資源給bean,它還不能完全使用。 當我們使用springIoC容器的getBean()方法獲取它時,它才會進行bean的初始化,完成依賴注入。springIoC容器的本質目的就是為了管理bean。
瞭解bean的生命週期,以便我們可以在springIoC容器初始化和銷燬bean時加入自己的自定義方法,以滿足特定的需求。

bean的生命週期過程
注意:上述的bean大部分是針對單個bean而言,而BeanPostProcesser介面是針對所有bean而言的。
用程式碼舉個測試說明(基於上面的juiceMaker程式碼基礎新增程式碼):

修改配置檔案

程式列印日誌
根據程式列印日誌結果出來看,我們可以對bean生命週期函式執行順序排序


以上就是執行的順序了。可以看到BeanPostProcessor針對全部bean