1. 程式人生 > >spring深入學習(一)深入理解 Spring IOC

spring深入學習(一)深入理解 Spring IOC

1、IOC理論

  • IOC英文縮寫:Inversion of control, 另一個縮寫為DI:依賴注入(Denpency Injection)
  • 用作控制反轉
  • 理解:spring IOC就是負責物件生命週期物件之間的關係

以找女朋友為例子:

一般情況下我們是如何來找女朋友的呢?首先我們需要根據自己的需求(漂亮、身材好、性格好)找一個妹子,然後到處打聽她的興趣愛好、微信、電話號碼,然後各種投其所好送其所要,最後追到手。如下:

/**
 * 年輕小夥子
 */
public class YoungMan {
    private BeautifulGirl beautifulGirl;

    YoungMan(){
        // 可能你比較牛逼,指腹為婚
        // beautifulGirl = new BeautifulGirl();
    }

    public void setBeautifulGirl(BeautifulGirl beautifulGirl) {
        this.beautifulGirl = beautifulGirl;
    }

    public static void main(String[] args){
        YoungMan you = new YoungMan();
        BeautifulGirl beautifulGirl = new BeautifulGirl("你的各種條件");
        beautifulGirl.setxxx("各種投其所好");

        // 然後你有女票了
        you.setBeautifulGirl(beautifulGirl);
    }
}

程式碼中,我們找女朋友需要我們自己取建立,善後,採購構建自己的女朋友。

而IOC的思想就是:相當於婚介所代替我們建立,善後這個過程,我麼只要使用就可以了。

201805071001

虛線:是沒有IOC狀態,被注入物件直接依賴被依賴物件。

實線:當被注入物件需要什麼服務時,IOC會把相應的被依賴的物件注入到被注入物件中。

注入的方法:

(1)構造器注入:

YoungMan(BeautifulGirl beautifulGirl){
        this.beautifulGirl = beautifulGirl;
}

(2)setter注入:

public class YoungMan {
    private BeautifulGirl beautifulGirl;

    public void setBeautifulGirl(BeautifulGirl beautifulGirl) {
        this.beautifulGirl = beautifulGirl;
    }
}

(3)介面方式注入:

需要被依賴的物件實現不必要的介面,帶有侵入性。

spring IOC四點必須理清:

  1. 誰控制誰:在傳統的開發模式下,我們都是採用直接 new 一個物件的方式來建立物件,也就是說你依賴的物件直接由你自己控制,但是有了 IOC 容器後,則直接由 IoC 容器來控制。所以“誰控制誰”,當然是 IoC 容器控制物件。
  2. 控制什麼:控制物件。
  3. 為何是反轉:沒有 IOC 的時候我們都是在自己物件中主動去建立被依賴的物件,這是正轉。但是有了 IOC 後,所依賴的物件直接由 IOC 容器建立後注入到被注入的物件中,依賴的物件由原來的主動獲取變成被動接受,所以是反轉。
  4. 哪些方面反轉了
    :所依賴物件的獲取被反轉了。

2、各個元件

spring最核心的五個元件為:Resource體系、BeanFactory 體系、Beandefinition 體系、BeandefinitionReader體系、ApplicationContext體系

(1)Resource體系(代表了一種資源的訪問策略,如ClasspathResource 、 URLResource ,FileSystemResource)

圖示:

spring-201805091003

有了資源就得載入,Spring 利用 ResourceLoader 來進行統一資源載入,圖示:

spring-201805091004

(2)BeanFactory 體系

BeanFactory是一個bean容器,其中 BeanDefinition 是她的基本結構,它內部維護著一個 BeanDefinition map ,並可根據 BeanDefinition 的描述進行 bean 的建立和管理。

spring-201805101001

BeanFacoty 有三個直接子類ListableBeanFactoryHierarchicalBeanFactory 和 AutowireCapableBeanFactoryDefaultListableBeanFactory 為最終預設實現,它實現了所有介面

(3)Beandefinition 體系

BeanDefinition 用來描述 Spring 中的 Bean 物件

spring-201805101002

(4)BeandefinitionReader體系

BeanDefinitionReader 的作用是讀取 Spring 的配置檔案的內容,並將其轉換成 Ioc 容器內部的資料結構:BeanDefinition

spring-201805101003

(5)ApplicationContext體系

spring-201805101004

這個就是大名鼎鼎的 Spring 容器,它叫做應用上下文,與我們應用息息相關,她繼承 BeanFactory,所以它是 BeanFactory 的擴充套件升級版,如果BeanFactory 是屌絲的話,那麼 ApplicationContext 則是名副其實的高富帥。由於 ApplicationContext 的結構就決定了它與 BeanFactory 的不同,其主要區別有:

  1. 繼承 MessageSource,提供國際化的標準訪問策略。
  2. 繼承 ApplicationEventPublisher ,提供強大的事件機制。
  3. 擴充套件 ResourceLoader,可以用來載入多個 Resource,可以靈活訪問不同的資源。
  4. 對 Web 應用的支援。

摘自:死磕spring —— 僅應用於個人學習