1. 程式人生 > 實用技巧 >Spring IoC與DI

Spring IoC與DI

Inversion of Control (IoC)

A bean is an object that is instantiated, assembled, and managed by a Spring IoC container. Otherwise, a bean is simply one of many objects in your application.

翻譯:bean是一個由Spring IoC容器例項化、組裝和管理的物件。

與傳統控制物件不同,物件由Spring IoC容器控制,而不由我們控制,所以稱為控制反轉。

Dependency Injection (DI)

Dependency injection (DI) is a process whereby objects define their dependencies (that is, the other objects with which they work) only through constructor arguments, arguments to a factory method, or properties that are set on the object instance after it is constructed or returned from a factory method.

翻譯:依賴注入(DI)是物件只能通過構造器引數工廠方法引數或者在屬性已經被構造或工廠方法返回後在物件例項上設定的屬性來定義他的依賴(依賴是指與他一起運作的其它的物件)的過程

通過官方文件原話我們可以得到以下有用的資訊:

  1. 依賴:與他一起運作的物件被稱為依賴。
    比如Person類將Dog類物件作為屬性,那麼Person類的建立將依賴Dog類。
  2. 注入:三種注入方式:
    1. 構造器
    2. 工廠方法
    3. 物件例項屬性

IoC與DI關係

IoC is also known as dependency injection (DI).

翻譯:IoC作為依賴注入(DI)所被熟知

為什麼Spring能解偶

通過下面例子來講解

這是Spring專案目錄結構

src
├── main
│ ├── java
│ │ └── cn
│ │     └── arrayblog
│ │         └── pojo
│ │             └── Hello.java
│ └── resources
│     └── beans.xml
└── test
    ├── java
    │ └── HelloTest.java
    └── resources

共包含Hello.javabeans.xmlHelloTest.java三個檔案

Hello.java:bean
beans.xml:定義bean物件
HelloTest.java:建立bean物件

傳統方式,僅Hello.javaHelloTest.java便能建立bean物件,屬性賦值需要通過構造器、set方法或者工廠方法手動賦值。

如果使用Spring,那麼你需要beans.xml來定義物件,HelloTest.java會根據beans.xml的內容所指定Hello.java來建立bean物件,並對其屬性自動賦值。

Q&A

Spring使得bean物件建立更復雜了嗎?

  • beans.xml檔案的引入使專案結構變得複雜
  • bean物件建立變得簡單,因為屬性自動賦值
  • bean物件易於管理,因為都被存在beans.xml

Spring如何做到解偶?

Spring通過beans.xml來降低了物件類使用該物件類建立物件的類的耦合度。

舉個例子

不使用Spring,當我們手動建立一個物件類使用該物件類建立物件的類,假設我們需要對使用該物件類建立物件的類進行關於物件類屬性值的修改,那我們需要重新編譯兩個檔案。

使用Spring,由於beans.xml不參與編譯的原因,上述情況就可以通過修改beans.xml內容來解決。