1. 程式人生 > >3. Inversion of Control (IoC)

3. Inversion of Control (IoC)

IOC是什麼

  • IOC即控制反轉。
  • 是抽象的,非具體的,設計思想或者設計模式。
  • “控制反轉”顧名思義,交出主動權。就程式設計而言,交出的是獲取依賴物件的主動權。

IOC的實現方式

主要實現方式有兩種:

  • 依賴查詢(Dependency Lookup): 容器提供回撥介面和上下文環境給元件。EJB和Apache Avalo都使用這種方式。
  • 依賴注入(Dependency Injection):元件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關係。這種也是當下主流的實現方式。有介面注入(Interface Injection),設值注入(Setter Injection)和構造子注入(Constructor Injection)三種方式。

依賴注入之所以更流行是因為它是一種更可取的方式:讓容器全權負責依賴查詢,受管元件只需要暴露JavaBean的setter方法或者帶引數的構造子或者介面,使容器可以在初始化時組裝物件的依賴關係。

其與依賴查詢方式相比,主要優勢為:

  • 查詢定位操作與應用程式碼完全無關。
  • 不依賴於容器的API,可以很容易地在任何容器以外使用應用物件。
  • 不需要特殊的介面,絕大多數物件可以做到完全不必依賴容器。

Spring IOC

Spring同過DI方式實現IOC容器來管理物件的依賴關係,在適當的時候將依賴物件注入到需要的物件中。物件的建立和銷燬都由spring來控制,即物件的生命週期是由spring來管理的。

org.springframework.beansorg.springframework.context提供了spring框架IOC容器的基本支援。

BeanFactory介面提供了一個能夠管理任何型別物件的高階配置機制。
ApplicationContextBeanFactory的子介面,具有更強大的功能:

  • 較容易增加spring AOP特性
  • 資訊資源處理(用於國際化)
  • 事件釋出
  • 載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層

Spring 容器

org.springframework.context.ApplicationContext

代表spring IOC容器,容器通過讀取配置的元資料來例項化、配置、和裝配bean。配置元資料的方式有 XML、註解、和java程式碼。

ApplicationContext有幾個實現類來方便使用,所謂的開箱即用(out-of-the-box)。比如ClassPathXmlApplicationContextFileSystemXmlApplicationContext。大多數情況下不需要使用者手動編碼例項化spring容器,比如WEB應用中,可以在web.xml中做一些配置來做例項化。