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>

更新於:2020年9月9日

2萬+瀏覽量

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.