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)是物件只能
通過構造器引數
、工廠方法引數
或者在屬性已經被構造或工廠方法返回後在物件例項上設定的屬性
來定義他的依賴(依賴是指與他一起運作的其它的物件)的過程
通過官方文件原話我們可以得到以下有用的資訊:
- 依賴:與他一起運作的物件被稱為依賴。
比如Person類將Dog類物件作為屬性,那麼Person類的建立將依賴Dog類。 - 注入:三種注入方式:
- 構造器
- 工廠方法
- 物件例項屬性
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.java
、beans.xml
和HelloTest.java
三個檔案
Hello.java
:bean
beans.xml
:定義bean物件
HelloTest.java
:建立bean物件
傳統方式,僅Hello.java
和HelloTest.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
內容來解決。