夯實Spring系列|第一章:IoC到底什麼是?

1.IoC 發展簡介

1.1 什麼是 IoC?

Inversion of control(IoC) is a programming principle.

簡單來說,IoC 是一種編程原則,相對於傳統的控制流(串行,順序執行)。IoC 是典型的反轉控制,IoC 相對傳統軟件架構來說更爲複雜,它可以解耦我們的一些相關的配置。

1.2 它從哪裏來?

最早應該是 1983 年,Richard E.Sweet 在《The Mesa Programming Environment》中提出的“Hollywood Principle”(好萊塢原則);

好萊塢原則:導演對來面試的演員說:不要給我們打電話,我們會打給你。

2004年,Martin Fowler 在《Inversion of Control Container and Dependency Injection pattern》中提出了自己對 IoC 以及 DI 的理解。

2005年,Martin Fowler 在《InversionOfControl》對 IoC 做了進一步說明

2.IoC 主要實現策略

Spring 兩位作者-《J2EE Development without EJB》書中中提到了 IoC 實現的主要策略 ,分別是依賴查找(Dependency Lookup)和依賴注入(Dependency Injection)。

  • Dependency Lookup : The Container provides callbacks to components,and a lookup context. This is the EJB and Apache Avalon approach. It leaves the onus on each component to use container APIs to lookup resources and collaborators. The Inversion of Control is limited to the container invoking callback methods that application code can user to obtain resources.
  • Dependency Injection : Components do no lookup; they provide plain Java methods enabling the container to resolve dependencies. The container is wholly responsible for wiring up components, passing resolved objects in to JavaBean properties or constructors. Use of JavaBean properties is called Setter Injection; use of constructor arguments is called Constructor Injection.

3.IoC容器的職責

3.1 通用職責

  • 依賴處理
    • 依賴查找
    • 依賴注入
  • 生命週期管理
    • 容器
    • 託管的資源(java Beans 或者其他資源)
  • 配置
    • 容器
    • 外部化配置
    • 託管的資源(java Beans 或者其他資源)

4.現有 IoC 容器的實現

其實IoC 並非 Spring Framework 的專利。

  • Java SE
    • Java Beans
    • Java ServiceLoader SPI
    • JNDI(Java Naming and Directory Interface)
  • Java EE
    • EJB(Enterprise Java Beans)
    • Servlet
  • 開源
    • Apache Avalon
    • PicoContainer
    • Google Guice
    • Spring Framework

5.依賴查找 VS 依賴注入

優劣對比

類型 依賴處理 實現便利性 代碼侵入性 API依賴性 可讀性
依賴查找 主動獲取 相對繁瑣 侵入業務邏輯 依賴容器API 良好
依賴注入 被動提供 相對便利 低侵入性 不依賴容器API 一般

沒有絕對的好與壞,只有相對的合理

6.構造器注入 VS Setter注入

6.1 構造器注入

  • spring官方鼓勵使用構造器注入

    • 優點
      • 被管理的對象都能有比較一致的狀態(比較符合面向對象的思想)
    • 缺點
      • 參數過多的話,代碼不是太簡潔

6.2 Setter注入

  • setter方法注入應該主要用於可選性的注入
    • 通常可以讓這個對象變的可以配置
    • 可以控制屬性設置的順序

總結:

沒有絕對的好與壞,只有相對的合理,個人更傾向於構造器注入,因爲在實際開發過程中,可以避免很多問題,比如狀態不確定性的被修改。

7.面試題

7.1 什麼是IoC?

簡單的說,IoC 是反轉控制,類似於好萊塢原則,主要有依賴查找和依賴注入兩種實現。

7.2 依賴查找和依賴注入的區別?

依賴查找是主動或者手動的依賴查找方式,通常需要依賴容器或者標準 API 實現,比如 BeanFactory.getBean()。而依賴注入則是手動或者自動依賴綁定的方式,無需依賴特定的容器和 API ,比如可以通過 XML 配置 byType、byName,又或者是我們最熟悉的 @Autowired

7.3 Spring作爲IoC容器有什麼優勢?

可以從以下方面進行回答:

  • 典型的IOC管理,依賴查找和依賴注入
  • AOP抽象
  • 事務抽象
  • 事件機制
  • SPI擴展
  • 強大的第三方整合
  • 易測試性
  • 更好的面向對象

8.參考

  • 極客時間-小馬哥《小馬哥講Spring核心編程思想》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章