日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring选择哪种注入方式

發布時間:2025/1/21 javascript 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring选择哪种注入方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. Spring常見的注入方式

1.1 Field注入

field即在變量上直接使用注解進行注入,內部使用反射的方式實現注入到field中。

  • 優點:代碼簡潔有效,最為開發人員喜歡使用
  • 缺點:依賴對象可能為null而報空指針異常,容易出現循環依賴問題
@Autowiredprivate GoodsCategoryService goodsCategoryService;

1.2 setter注入

spring 3.x版本中推薦使用的注入方式,通過在set方法上使用注解完成對象注入。

  • 優點:選擇性注入,可有可無,依賴不會影響整個項目運行
  • 缺點:在對象實例化后,依賴信息依然可以通過set方法修改,不太好
private GoodsCategoryService goodsCategoryService;@Autowiredpublic setGoodsCategoryService(GoodsCategoryService goodsCategoryService){this.goodsCategoryService = goodsCategoryService;} ? ?

1.3 構造器注入

spring 4.x版本時Spring團隊推薦使用的注入方式,將注解標注在構造函數上,對象以參數的形式傳遞,在構造函數中完成注入對象的初始化。

  • 優點:變量定義使用強制性的顯式注入(final關鍵字保證不可變)、避免空指針和循環依賴,
  • 缺點:在需要注入的依賴較多時,使用構造方法臃腫
private final GoodsCategoryService goodsCategoryService; @Autowired public GoodServiceImpl(GoodsCategoryService goodsCategoryService){this.goodsCategoryService = goodsCategoryService; }

2. Spring為什么推薦使用構造器注入

Field注入盡管代碼上簡潔有效,但是會帶來一些問題:

  • 對于IOC容器以外的環境,除了使用反射來提供它需要的依賴之外,無法復用該實現類
  • 不調用依賴bean時,不會發現空指針的異常,在運行時調用會報異常
  • 使用field注入可能會導致循環依賴,即A里面注入B,B里面又注入A
  • 會造成依賴臃腫,職責過多,使用Filed注入時,添加數量不受限制(沒有警告),可能會注入過多的依賴項,違反了單一職責原則。
  • Setter方法注入是Spring 3.x版本推薦的注入方式,因為setter的方式能用讓類在之后重新配置或者重新注入,但是

    • 寫起來比較麻煩,每個依賴都需要一個set方法
    • 可以重新配置或注入雖然方便,但是有些依賴需要不可變,使用此種方式產生不確定性

    構造器注入是Spring 4.x 版本推薦的注入方式,主要優點有:

  • 依賴不可變,使用final定義,保證注入后的不可變
  • 依賴不為null,使用構造函數傳參的方式,在實例化對象傳參時如果參數為null,則報錯,提前避免了空指針異常
  • 在傳參時傳入的是依賴對象,而該對象傳入時會保證對象類已經完成了初始化,也同時保證了對象不為null
  • 如果構造器注入時發生了循環依賴,在項目啟動時就會報錯BeanCurrentlyInCreationException,而Field注入只有在使用時才會報錯
  • 3. @Autowired、@Resource和@Inject的區別

    3.1 @Autowired

    • @Autowired注解是Spring2.5之后帶入的注解,通過AutowiredAnnotationBeanPostProcessor類實現注入
    • @Autowired可以標注在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE之上
    • @Autowired默認根據bean類型進行自動裝配,byType
    • @Autowired注入時如果發現同類型有多個bean,此時需要使用@Qualifier注解來指定bean的name,即byName
    • @Autowired注解有屬性required,默認為true,設置為false則表示未找到對應bean時不拋出異常

    3.2 @Resource

    • @Resource時javax.annotation包下的注解
    • @Resource可以標注在TYPE, FIELD, METHOD之上
    • @Resource是根據屬性名稱進行自動裝配的,其擁有屬性name,可以根據屬性值指定裝配bean的name

    3.3 @Inject

    @Inject注解需要導入javax.inject.Inject包,能實現注入 @Inject可以標注在CONSTRUCTOR、METHOD、FIELD之上 @Inject注解是根據類型自動裝配的,如果需要指定名稱,則需要配合@Named注解

    4. 總結

    盡管Spring 4.x 推薦使用構造器注入,但是我們仍然可以使用其他方式,且可以使用混合方式注入

    • 不可變的注入使用構造器
    • 可變可選注入使用setter方法
    • 對于多實現的依賴注入時,可以使用Filed注入或者setter方法來指定注入的實現
    • 實際使用Field注入的仍然很多,大部分是一些遺留問題,后續新項目可以嘗試盡量避免Field注入

    總結

    以上是生活随笔為你收集整理的Spring选择哪种注入方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。