最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談spring DI 依賴注入方式和區(qū)別

 更新時間:2021年07月29日 11:33:36   作者:arjun  
Spring框架對Java開發(fā)的重要性不言而喻,本文主要介紹了spring DI 依賴注入方式和區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下

spring DI

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

3種DI注解的區(qū)別

1 @Autowired

使用特點

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

使用過程

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

b、 還可以寫在構(gòu)造方法上、setter方法上

c、@Qualifier
@Qualifier("XXX") 中的 XX是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結(jié)合使用時,自動注入的策略就從 byType 轉(zhuǎn)變成 byName 了。
不過需要注意的是@Autowired 可以對成員變量、方法以及構(gòu)造函數(shù)進行注釋,而 @Qualifier 的標(biāo)注對象是成員變量、方法入?yún)?、?gòu)造函數(shù)入?yún)ⅰ?/p>

2 @Inject

使用特點

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

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

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

3 @Resource

使用特點

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

使用過程
a、@Resource實例

3種注入方式的區(qū)別

注意項

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

1 field注入

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

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

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

2 構(gòu)造器注入

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

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

3 setter注入

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

在Spring3.x剛推出的時候,推薦使用注入的就是這種,現(xiàn)在很少使用這種注解方式,寫起來麻煩,當(dāng)初推薦Spring自然也有他的道理: 構(gòu)造器注入?yún)?shù)太多了,顯得很笨重,另外setter的方式能用讓類在之后重新配置或者重新注入。

構(gòu)造器注入的好處

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.

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

1 依賴不可變

屬性使用final關(guān)鍵字修飾

2 依賴不為空

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

3 完全初始化狀態(tài)

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

4 避免循環(huán)依賴

使用field注入可能會導(dǎo)致循環(huán)依賴,即A里面注入B,B里面又注入A:

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

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

5 總結(jié)

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

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

到此這篇關(guān)于淺談spring DI 依賴注入方式和區(qū)別的文章就介紹到這了,更多相關(guān)spring DI 依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java如何用反射將一個對象復(fù)制給另一個對象

    java如何用反射將一個對象復(fù)制給另一個對象

    這篇文章主要介紹了java如何用反射將一個對象復(fù)制給另一個對象問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 解決Mybatis-plus和pagehelper依賴沖突的方法示例

    解決Mybatis-plus和pagehelper依賴沖突的方法示例

    這篇文章主要介紹了解決Mybatis-plus和pagehelper依賴沖突的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 使用ServletInputStream()輸入流讀取圖片方式

    使用ServletInputStream()輸入流讀取圖片方式

    這篇文章主要介紹了使用ServletInputStream()輸入流讀取圖片方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java并發(fā)編程之Fork/Join框架的理解

    Java并發(fā)編程之Fork/Join框架的理解

    今天帶大家學(xué)習(xí)Java并發(fā)編程的相關(guān)知識,文中對Fork/Join框架作了非常詳細(xì)的介紹,對正在學(xué)習(xí)有關(guān)知識的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • java實現(xiàn)識別二維碼圖片功能方法詳解與實例源碼

    java實現(xiàn)識別二維碼圖片功能方法詳解與實例源碼

    這篇文章主要介紹了java實現(xiàn)識別二維碼圖片,java無法識別二維碼情況下對二維碼圖片調(diào)優(yōu)功能方法與實例源碼,需要的朋友可以參考下
    2022-12-12
  • 通過Mybatis實現(xiàn)單表內(nèi)一對多的數(shù)據(jù)展示示例代碼

    通過Mybatis實現(xiàn)單表內(nèi)一對多的數(shù)據(jù)展示示例代碼

    最近做項目遇到這樣的需求要求將表中的數(shù)據(jù),按照一級二級分類返回給前端json數(shù)據(jù),下面通過本文給大家分享通過Mybatis實現(xiàn)單表內(nèi)一對多的數(shù)據(jù)展示示例代碼,感興趣的朋友參考下吧
    2017-08-08
  • JAVA基礎(chǔ)之一些不為人知的那些秘密

    JAVA基礎(chǔ)之一些不為人知的那些秘密

    一個 Java 程序可以認(rèn)為是一系列對象的集合,而這些對象通過調(diào)用彼此的方法來協(xié)同工作,下面這篇文章主要給大家介紹了JAVA基礎(chǔ)之一些不為人知的那些秘密,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解

    mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解

    這篇文章主要介紹了mybatis mybatis-plus-generator+clickhouse自動生成代碼案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Springboot四種事件監(jiān)聽的實現(xiàn)方式詳解

    Springboot四種事件監(jiān)聽的實現(xiàn)方式詳解

    這篇文章主要介紹了Springboot四種事件監(jiān)聽的實現(xiàn)方式,事件監(jiān)聽是一種機制,可以定義和觸發(fā)自定義的事件,以及在應(yīng)用程序中注冊監(jiān)聽器來響應(yīng)這些事件,需要的朋友可以參考下
    2022-06-06
  • java二維數(shù)組指定不同長度實例方法

    java二維數(shù)組指定不同長度實例方法

    在本篇內(nèi)容里小編給大家分享了一篇關(guān)于java二維數(shù)組指定不同長度實例方法,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03

最新評論

长垣县| 乐清市| 体育| 和硕县| 湘潭县| 石门县| 临汾市| 通江县| 平罗县| 鸡西市| 奇台县| 古浪县| 达拉特旗| 安国市| 美姑县| 班戈县| 沽源县| 溧水县| 山阴县| 都兰县| 龙南县| 鸡西市| 乌鲁木齐县| 重庆市| 曲靖市| 东港市| 攀枝花市| 呼伦贝尔市| 化隆| 陕西省| 公安县| 太仆寺旗| 剑川县| 兴山县| 上杭县| 咸宁市| 体育| 台安县| 汉川市| 吉林市| 红河县|