一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 淺談spring DI 依賴注入方式和區別

淺談spring DI 依賴注入方式和區別

2021-10-27 11:00arjun Java教程

Spring框架對Java開發的重要性不言而喻,本文主要介紹了spring DI 依賴注入方式和區別,具有一定的參考價值,感興趣的小伙伴們可以參考一下

spring DI

Spring框架對Java開發的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反轉)和AOP,平時使用最多的就是其中的IOC,我們通過將組件交由Spring的IOC容器管理,將對象的依賴關系由Spring控制,避免硬編碼所造成的過度程序耦合。

 

3種DI注解的區別

 

1 @Autowired

使用特點

  • Autowired注解是spring框架提供的
  • Autowired注解優先byType獲取java bean,其次byName
  • Autowired注解配合Qualifier注解區分java bean的名稱,主要用于同一個類型的javabean有多個實
  • Autowired注解注入的對象,一般要求非null,如果允許為null,需要required=false屬性聲明
  • @Autowired可以作用在變量、setter方法、構造函數上

使用過程

a、 將@autowored寫在被注入的成員變量上,就不用再xml文件中配置了,在程序中去掉相應的setter和getter方法,

b、 還可以寫在構造方法上、setter方法上

淺談spring DI 依賴注入方式和區別

c、@Qualifier
@Qualifier("XXX") 中的 XX是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。
不過需要注意的是@Autowired 可以對成員變量、方法以及構造函數進行注釋,而 @Qualifier 的標注對象是成員變量、方法入參、構造函數入參。

淺談spring DI 依賴注入方式和區別

 

2 @Inject

使用特點

  • @Inject是JSR330 (Dependency Injection for Java)中的規范,需要導入javax.inject.Inject; 實現注入
  • @Inject是根據類型進行自動裝配的,如果需要按名稱進行裝配,則需要配合@Named
  • @Inject可以作用在變量、setter方法、構造函數上
  • 與@Autowired使用類似,想比之下,采用spring提供的@Autowired更為普遍

使用過程
a、 將@Inject可以作用在變量、setter方法、構造函數上,和@Autowired一樣

淺談spring DI 依賴注入方式和區別

b、@Named
@Named("XXX") 中的 XX是 Bean 的名稱,所以 @Inject和 @Named結合使用時,自動注入的策略就從 byType 轉變成 byName 了。

淺談spring DI 依賴注入方式和區別

 

3 @Resource

使用特點

  • esource注解是jdk提供的,屬于j2ee規范
  • Resource注解優先byname獲取java bean,其次byType
  • Resource注解的屬性名稱作為java bean的名稱進行查找,如果有name參數,則使用name參數查找java bean
  • Resource注解如果聲明了name屬性,則必須按照name查找對象,不會再使用類型查找
  • @Resource可以作用在變量、setter方法上

使用過程
a、@Resource實例

淺談spring DI 依賴注入方式和區別

 

3種注入方式的區別

注意項

  • 注入方式:field注入、setter注入與構造器注入
  • spring推薦使用setter方法和構造器注入Autowired的bean對象,因此IDEA等工具中私有屬性使用Autowired注入會提示警告。setter方法和構造器注入的方式,可以讓對象不依賴于spring而獨立使用,更加靈活;私有屬性則只能通過spring上下文自動注入,一旦注入失敗,沒有重新注入的方式。
  • @Resource不能用于構造器注入

 

1 field注入

@Controller
public class FooController {
  @Autowired
  //@Inject
  private FooService fooService;
  
  //簡單的使用例子,下同
  public List<Foo> listFoo() {
      return fooService.list();
  }
}

這種注入方式應該是最常見的注入方式。原因很簡單:

  • 注入方式簡單:加入要注入的字段,附上@Autowired,即可完成。
  • 使得整體代碼簡潔明了,看起來美觀大方。

 

2 構造器注入

@Controller
public class FooController {
  
  private final FooService fooService;
  
  @Autowired
  public FooController(FooService fooService) {
      this.fooService = fooService;
  }
  
  //使用方式上同,略
}

Spring4.x版本中推薦的注入方式,相較于field注入方式,就顯得有點難看,特別是當注入的依賴很多(5個以上)的時候,就會明顯的發現代碼臃腫。
構造器注入的好處后面單獨討論。

 

3 setter注入

@Controller
public class FooController {
  
  private FooService fooService;
  
  //使用方式上同,略
  @Autowired
  public void setFooService(FooService fooService) {
      this.fooService = fooService;
  }
}

在Spring3.x剛推出的時候,推薦使用注入的就是這種,現在很少使用這種注解方式,寫起來麻煩,當初推薦Spring自然也有他的道理: 構造器注入參數太多了,顯得很笨重,另外setter的方式能用讓類在之后重新配置或者重新注入。

 

構造器注入的好處

Spring在文檔里怎么說:

The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.

簡單的翻譯一下:構造器注入的方式,能夠保證注入的組件不可變,并且確保需要的依賴不為空。此外,構造器注入的依賴總是能夠在返回客戶端(組件)代碼的時候保證完全初始化的狀態。

 

1 依賴不可變

屬性使用final關鍵字修飾

 

2 依賴不為空

(省去了我們對null的檢查)
當要實例化類的時候,由于類已經實現了有參數的構造函數,所以不會調用默認構造函數,那么就需要Spring容器傳入所需要的參數,所以就兩種情況:1、有該類型的參數->傳入,OK 。2:無該類型的參數->報錯。所以保證不會為空,Spring不會傳一個null進去
如果使用field注入,缺點顯而易見,因為你不調用將一直無法發現NPE的存在。

 

3 完全初始化狀態

這個可以跟上面的依賴不為空結合起來,向構造器傳參之前,要確保注入的內容不為空,那么肯定要調用依賴組件的構造方法完成實例化。而在Java類加載實例化的過程中,構造方法是最后一步(之前如果有父類先初始化父類,然后自己的成員變量,最后才是構造方法)。所以返回來的都是初始化之后的狀態。

 

4 避免循環依賴

使用field注入可能會導致循環依賴,即A里面注入B,B里面又注入A:

public class A {
    @Autowired
    private B b;
}
?
public class B {
    @Autowired
    private A a;
}

使用構造器注入,在spring項目啟動的時候,就會拋出:BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?從而提醒你避免循環依賴;
如果是field注入的話,啟動的時候不會報錯,在使用那個bean的時候才會報錯。

 

5 總結

  1. 保證依賴不可變(final關鍵字)
  2. 保證依賴不為空(省去了我們對其檢查)
  3. 避免了循環依賴
  4. 當有一個依賴有多個實現的使用,推薦使用field注入或者setter注入的方式來指定注入的類型

Q1:跟3.x里說的一樣,我要是有大量的依賴要注入,構造方法不會顯得很臃腫嗎?
對于這個問題,說明你的類當中有太多的責任,那么你要好好想一想是不是自己違反了類的單一性職責原則,從而導致有這么多的依賴要注入。
Q2:是不是其他的注入方式都不適合用了呢?
存在即是合理!setter的方式既然一開始被Spring推薦肯定是有它的道理,像之前提到的setter的方式能用讓類在之后重新配置或者重新注入,就是其優點之一。除此之外,如果一個依賴有多種實現方式,我們可以使用@Qualifier,在構造方法里選擇對應的名字注入,也可以使用field或者setter的方式來手動配置要注入的實現。

到此這篇關于淺談spring DI 依賴注入方式和區別的文章就介紹到這了,更多相關spring DI 依賴注入內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6989508510560026637

延伸 · 閱讀

精彩推薦
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 乳环贵妇堕落开发调教番号 | 9总探花新品牛仔背带裤 | 久久aa毛片免费播放嗯啊 | 日韩欧美一区二区三区中文精品 | 午夜宅男在线观看 | 毛片一级毛片 | 九草视频在线 | 欧美bbxx | 丝袜性爱| 99热成人精品免费久久 | 爱情岛永久成人免费网站 | videodesexo中国妞 | 日日免费视频 | 国产精品特黄毛片 | 五月桃花网婷婷亚洲综合 | 午夜免费啪视频观看视频 | 国产精品中文字幕 | 美女gif趴跪式抽搐动态图 | 黑人与欧洲女子性大战 | 国产99视频精品免费视频7 | 温柔校草高h | 999任你躁在线精品免费不卡 | 欧美做受| 掰开逼操 | 国产精品久久久久久影视 | 香蕉久久一区二区三区啪啪 | 女教师三级做受 | 耽美双性 | 免费免费啪视频在线观播放 | 亚洲第一在线播放 | yellow片在线观看 | 亚洲精品卡一卡2卡3卡4卡 | 高清女主播一区二区三区 | 国产乱码免费卡1卡二卡3卡四 | 天天综合天天综合 | 亚洲狠狠婷婷综合久久久久网站 | 午夜国产精品福利在线观看 | 99r8这里精品热视频免费看 | 美女日b视频 | 精品老司机在线视频香蕉 | 久久久亚洲国产精品主播 |