3. Inversion of Control (IoC)
阿新 • • 發佈:2019-02-17
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.beans
和 org.springframework.context
提供了spring框架IOC容器的基本支援。
BeanFactory
介面提供了一個能夠管理任何型別物件的高階配置機制。
ApplicationContext
是 BeanFactory
的子介面,具有更強大的功能:
- 較容易增加spring AOP特性
- 資訊資源處理(用於國際化)
- 事件釋出
- 載入多個(有繼承關係)上下文 ,使得每一個上下文都專注於一個特定的層次,比如應用的web層
Spring 容器
org.springframework.context.ApplicationContext
ApplicationContext
有幾個實現類來方便使用,所謂的開箱即用(out-of-the-box)。比如ClassPathXmlApplicationContext
和FileSystemXmlApplicationContext
。大多數情況下不需要使用者手動編碼例項化spring容器,比如WEB應用中,可以在web.xml中做一些配置來做例項化。