Spring Framework ‐ IOC 容器 - CCH0124/spring-sandbox GitHub Wiki

Spring 透過 IoC 容器來管理所有 Java 物件的實例化和初始化,控制物件與物件之間的依賴關係。我們將由 IoC 容器管理的 Java 物件稱為 Spring Bean,它與使用關鍵字 new 建立的 Java 物件沒有任何區別。

Java 開發領域物件的建立以及管理的問題

IoC(Inversion of control)

  • 控制反轉是為了降低程式耦合度,提高程式擴展力
  • 將物件的創建權利交出去,交給第三方容器負責
  • 將物件和物件之間關係的維護權交出去,交給第三方容器負責

傳統:在類別 A 透過 new 關鍵字來 new 一個 B 物件出來 IoC 方式:不透過 new 關鍵字來建立對象,而是透過 IoC 容器(Spring 框架) 來幫助我們實例化物件。因此需要哪個物件,就直接從 IoC 容器裡面去拿即可

IoC 讓我們可以不用考慮物件的創建、管理等生命週期。

那控制和反轉個別是什麼 ?

控制:指的是物件創建(實例化、管理)的權力

反轉:控制權交給外部環境(IoC 容器)

todo 圖

IOC 容器中放的是 Bean 物件,使用的是 Map 集合進行儲存。控制反轉這種概念是透過 DI(Dependency Injection) 實現。

解決什麼問題

雙方不互相依賴,由第三方資源進行管理。這樣會有

  • 物件之間的耦合度降低
  • 資源容易管理;例如你用 Spring 容器提供的話很容易就可以實作一個單例。

todo 範例

DI(Dependency Injection) 依赖注入

依賴注入實現了控制反轉,而 DI 是對 IOC 的一種具體實現。其指 Spring 創建物件的過程中,將物件依賴屬性透過配置進行注入。依賴注入常見的實作方式包括兩種:

  • set 方法注入
  • 構造方法注入

Bean 管理說的是:Bean 物件的創建,以及 Bean 物件中屬性的賦值或稱為 Bean 物件之間關係的維護。

IoC 和 DI 有區別嗎?

IoC(控制反轉)是一種設計模式。這個設計就是將原本在程式中手動建立物件的控制權交給第三方例如 IoC 容器。以 Spring 框架來說, IoC 容器其實就是個 Map 資料結構,Map 中存放的是各種物件。但,IoC 非 Spring 特有,其他語言也存在著。

Spring 中的 IoC

IoC 容器中管理的元件也叫做 bean。在建立 bean 之前,首先需要建立 IoC 容器。 Spring 提供了 IoC 容器的兩種實作方式:

  1. BeanFactory Spring 內部使用的介面。面向 Spring 本身,不提供給開發人員使用,它提供了管理 Bean 的基本功能。

  2. ApplicationContext BeanFactory 的子接口,提供了更多高階特性,像是解析訊息、支援國際化、發布事件和應用程式層特定上下文(application-layer specific contexts),這就是我們使用它作為預設 Spring 容器的原因。針對 Spring 的使用者,幾乎所有場合都使用 ApplicationContext 而不是底層的 BeanFactory

BeanFactoryApplicationContext 代表 Spring IoC 容器。

AnnotationConfigApplicationContextApplicationContext 的其中一個類型。它可用 @Configuration@Component 和 JSR-330 元資料註解的類別作為輸入。下面範例會是之後內容的重要應用核心。

ApplicationContext context = new AnnotationConfigApplicationContext(config.class);
Car car = context.getBean(Car.class);