Spring框架中構造器注入和Setter注入的區別
依賴注入是一種將依賴物件傳遞給其他物件的實踐。Spring有兩種型別的依賴注入
基於建構函式的注入 - 當容器呼叫類的建構函式時。它應該用於強制依賴。
假設類X緊密依賴於類Y,那麼我們應該使用基於建構函式的注入。
基於Setter的注入 - 它可以透過呼叫bean上的setter方法來使用。它應該用於可選依賴。
兩種注入型別各有優缺點。下面列出了一些區別:
| 序號 | 關鍵點 | 基於建構函式的注入 | 基於Setter的注入 |
|---|---|---|---|
| 1 | 迴圈依賴 | 它不允許建立迴圈依賴 | 它不檢查迴圈依賴 |
| 2 | 順序 | 基於建構函式的DI確定了需要注入依賴項的順序。 | 基於Setter的DI幫助我們僅在需要時注入依賴項,而不是在構造時就需要它。 |
| 3 | 多執行緒環境 | 結合final欄位,建構函式注入在多執行緒環境中提供了額外的安全性 | Setter注入沒有額外的好處 |
| 4 | Spring程式碼生成庫 | Spring程式碼生成庫不支援建構函式注入,因此它將無法建立代理。它將強制您使用無引數建構函式。 | Spring框架級別的程式碼使用Setter注入 |
| 5 | 用例 | 它應該用於強制依賴 | 它應該用於可選依賴。 |
建構函式注入示例
public class ConstructorInjectionExample {
public ConstructorInjectionExample(BaseExmp baseExmp) {
// ...
}
}
<beans>
<bean id = "ConstructorInjectionExample" class = "x.y.ConstructorInjectionExample">
<constructor-arg ref = "baseExmp"/>
</bean>
<bean id = "baseExmp" class = "x.y.BaseExmp"/>
</beans>Setter注入示例
public class SetterInjectionExample {
public void setBaseExmp(BaseExmp baseExmp) {
this.baseExmp = baseExmp;
}
}
<beans>
<bean id = "setterInjectionExample" class = "x.y.SetterInjectionExample">
<property name = "baseExmp" ref = "baseExmp"/>
</bean>
</beans>
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP