在Spring中對IoC的理解

2021-10-08 15:59:16 字數 2755 閱讀 3408

依賴注入的幾種方式

ioc的優缺點

ioc控制反轉(baiinversion of control,英文縮寫為ioc),把建立物件的權利交給框架,是框架的重要特徵,ioc不是一種技術,而是一種設計思想,並非物件導向程式設計的專用術語。它包括依賴注入(dependency injection,簡稱di)和依賴查詢(dependency lookup)。

傳統的建立物件方式是通過關鍵字new進行建立,ioc的思想是通過spring容器來建立物件,由容器來控制物件。

何為正轉,何為反轉?傳統應用程式是由我們自己在物件中主動控制去直接獲取依賴物件,也就是正轉;而反轉則是由容器來幫忙建立及注入依賴物件,當有了ioc/di的容器後,在客戶端類中不再主動去建立這些物件了。為何是反轉?因為由容器幫我們查詢及注入依賴物件,物件只是被動的接受依賴物件,所以是反轉;哪些方面反轉了?依賴物件的獲取被反轉了

ioc不是一種技術,只是一種思想,乙個重要的物件導向程式設計的法則,它能指導我們如何設計出低耦合、高優良的程式。傳統應用程式都是由我們在類內部主動建立依賴物件,從而導致類與類之間高耦合,難於測試;有了ioc容器後,把建立和查詢依賴物件的控制權交給了容器,由容器進行注入組合物件,所以物件與物件之間是鬆散耦合,這樣也方便測試,利於功能復用,更重要的是使得程式的整個體系結構變得非常靈活。

di—dependency injection,即「依賴注入」:元件之間依賴關係由容器在執行期決定,形象的說,即由容器動態的將某個依賴關係注入到元件之中。依賴注入的目的並非為軟體系統帶來更多功能,而是為了提公升元件重用的頻率,並為系統搭建乙個靈活、可擴充套件的平台。通過依賴注入機制,我們只需要通過簡單的配置,而無需任何**就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。

理解di的關鍵是:「誰依賴誰,為什麼需要依賴,誰注入誰,注入了什麼」,那我們來深入分析一下:

ioc和di由什麼關係呢?其實它們是同乙個概念的不同角度描述,由於控制反轉概念比較含糊(可能只是理解為容器控制物件這乙個層面,很難讓人想到誰來維護物件關係),所以2023年大師級人物martin fowler又給出了乙個新的名字:「依賴注入」,相對ioc 而言,「依賴注入」明確描述了「被注入物件依賴ioc容器配置依賴物件」。

1.對於yml中定義了的bean,可以使用 @value("$") 進行注入。 如果是物件變數,可以直接在變數上使用value註解進行注入。如果是下圖這樣的靜態變數,就需要在set方法上使用value註解。注意:必須是在spring容器中的物件才能夠進行注入,即需要加@component註解。

student

:name

: 小明

age:15

@component

public

class

student")

public

void

setname

(string name)

@value

("$"

)public

void

setage

(int age)

}

student

:name

: 小明

age:15

@component

@configurationproperties

(prefix =

"student"

)public

class

student

public

void

setage

(int age)

}

3.可以使用@configuration、@propertysource(value=「classpath:test.properties」)、@configurationproperties(prefix=「student」)這三個註解將resources檔案下test.properties描述的student物件的屬性注入到student物件中(即使用自定義的配置檔案,將屬性注入到物件中)。 @configuration註解可以替換為@component註解,@configuration註解其實繼承了@component註解,用來表示該類是配置類。

student.name = '小白'

student.age = 16

@configuration

@propertysource

(value=

)@configurationproperties

(prefix=

"student"

)public

class

student

public

void

setage

(int age)

}

4.還可以使用@autowired註解對已經存在於ioc容器中的物件實現自動注入。

優點:可以靈活提供不同的子類實現(其實就是解耦),提高程式的靈活性、可擴充套件性和可維護性。由ioc容器通過配置檔案來管理物件的生命週期、依賴關係等,這樣就不用重新修改並編譯具體的**,從而實現元件之間的解耦。

缺點:1、建立物件的步驟變複雜了,不直觀,當然這是對不習慣這種方式的人來說的。

2、因為使用反射來建立物件,所以在效率上會有些損耗。但相對於程式的靈活性和可維護性來說,這點損耗是微不足道的。

本文參考:

對Spring中IOC思想的理解

獲取使用者資料傳統實現方式為 1 iuserdao介面 package indi.stitch.dao public inte ce iuserdao 2 userdaoimpl實現類 package indi.stitch.dao public class userdaoimpl implemen...

快速理解Spring中的IoC

控制反轉 inversion of control,縮寫為ioc 是物件導向程式設計中的一種設計原則,可以用來減低計算機 之間的耦合度。其中最常見的方式叫做依賴注入 dependency injection,簡稱di 還有一種方式叫 依賴查詢 dependency lookup 通過控制反轉,物件在...

Spring控制反轉 IoC 的理解

spring框架的核心就是控制反轉 inversion of control 和依賴注入 dependency injection 通過這兩方面來實現松耦合。使用ioc,物件是被動的接受依賴類,而不是自己主動的去找。容器在例項化的時候主動將它的依賴類注入給它。可以這樣理解 控制反轉將類的主動權轉移到...