Java面試題:讓依賴註入變得簡單,面對@Autowired和@Resource,該如何選擇?

来源:https://www.cnblogs.com/marsitman/p/18195206
-Advertisement-
Play Games

@Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...


@Autowired和@Resource都是Java Spring框架中的註解,用於實現依賴註入(DI)和控制反轉(IoC)。

它們的區別主要在以下三個方面:


源頭不同 

@Autowired是Spring自帶的註解,而@Resource是JSR 250規範中定義的註解。因此,在使用Spring框架的時候,通常建議使用@Autowired註解。 

 

查找順序不同 

在註入Bean時,@Autowired註解的查找順序為:先按類型(byType)匹配,如果有多個Bean符合該類型,則再按照名稱(byName)進行匹配。如果兩種方式都無法唯一確定Bean,則會拋出異常。
偽代碼如下:

public class Person {
    private Phone phone;

    @Autowired
    public void setPhone(Phone phone) {
        this.phone = phone;
    }

    //...
}

public interface Phone {
    //...
}

@Component("apple")
public class ApplePhone implements Phone {
    //...
}

@Component("huawei")
public class HuaweiPhone implements Phone {
    //...
}

在上面的示例中,如果有ApplePhone和HuaweiPhone兩個Bean都實現了Phone介面,那麼當Person類的setPhone方法被調用時,Spring會根據類型匹配到這兩個Bean,但是無法唯一確定,此時會拋出異常。可以通過添加@Qualifier註解來指定具體的Bean:

偽代碼如下:
@Autowired
@Qualifier("apple")
public void setPhone(Phone phone) {
    this.phone = phone;
}

而@Resource註解的查找順序為:先按照名稱(byName)進行匹配,如果無法匹配到Bean,則再按照類型(byType)進行匹配。

偽代碼如下:
public class Person {
    private Phone phone;

    @Resource(name = "apple")
    public void setPhone(Phone phone) {
        this.phone = phone;
    }

    //...
}

@Component("apple")
public class ApplePhone implements Phone {...}

@Component("huawei")
public class HuaweiPhone implements Phone {...}

在上面的示例中,當Person類的setPhone方法被調用時,Spring會先根據名稱查找是否有名稱為"apple"的Bean,如果有,則直接註入;如果沒有,則再根據類型匹配。

 

適用範圍不同

@Autowired註解可以用於構造器、Setter方法、欄位和方法上,而@Resource註解只能用於欄位和方法上。因此,如果需要在構造器中註入Bean,就必須使用@Autowired註解。綜上所述,建議在使用Spring框架時,儘量使用@Autowired註解。
以下是具體的代碼示例:

public interface Phone {
    String brand();
}

@Component("apple")
public class ApplePhone implements Phone {
    @Override
    public String brand() {
        return "Apple";
    }
}

@Component("huawei")
public class HuaweiPhone implements Phone {
    @Override
    public String brand() {
        return "Huawei";
    }
}

@Component
public class Person {

    // 使用@Autowired註解進行註入
    @Autowired
    private Phone phone1;

    // 使用@Resource註解進行註入,指定名稱
    @Resource(name = "apple")
    private Phone phone2;

    private Phone phone3;

    public void setPhone3(Phone phone3) {
        this.phone3 = phone3;
    }

    // 使用@Autowired註解和@Qualifier註解進行註入
    @Autowired
    @Qualifier("huawei")
    public void setPhone4(Phone phone4) {
        this.phone4 = phone4;
    }
}

在上面的示例中,Person類中有四個屬性需要註入Bean。其中,phone1屬性使用了@Autowired註解,使用預設的查找方式進行註入;phone2屬性使用了@Resource註解,並指定了名稱為"apple"的Bean進行註入;phone3屬性沒有。

 

總結一下:

  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 

  • @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。  

  • @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resource 預設按照名稱進行註入,如果指定了name或者type屬性,則會按照指定的名稱或者類型來查找對應的Bean實例進行註入


綜上所述,@Autowired更加靈活,但也更加複雜;@Resource更加簡單、直觀,適用於簡單的場景。

 

 

往期面試題:

Java面試題:如果你這樣做,你會後悔的,兩次啟動同一個線程~~~

Java面試題:@PostConstruct、init-method和afterPropertiesSet執行順序?

Java面試題:SimpleDateFormat是線程安全的嗎?使用時應該註意什麼?

Java面試題:細數ThreadLocal大坑,記憶體泄露本可避免

Java面試題:請談談對ThreadLocal的理解?

Java面試題:為什麼HashMap不建議使用對象作為Key?

Java面試題:你知道Spring的IOC嗎?那麼,它為什麼這麼重要呢?

Java面試題:線程池內“鬧情緒”的線程,怎麼辦?

Java面試題:Spring Bean線程安全?別擔心,只要你不寫併發代碼就好了!

Java面試題:Spring框架除了IOC和AOP,還有哪些好玩的設計模式?

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文記錄我在對接位元組旗下產品火山雲旗下雲游戲產品 OpenApi 介面文檔時遇到的坑,希望能幫助大家(火山雲旗下雲游戲產品的文檔坑很多,我算是從零到一都踩了一遍,特此記錄,希望大家引以為鑒)。 1. 文檔問題 很經典的開局一張圖,對接全靠問, 這裡給大家強調下,當要跟第三方產品對接時,一定要確認拿到 ...
  • 抽象類與介面的理解、設計思路與實際用途 在面向對象的編程中,抽象類和介面是兩個非常重要的概念,它們為開發者提供了創建可重用、可擴展和可維護代碼的基礎。下麵我們將從理解、設計思路和實際用途三個方面來探討抽象類和介面。 1. 抽象類(Abstract Class) 理解: 抽象類是一種不能被實例化的類, ...
  • 正文 今天是做櫃員的第一天,準確來說是半天。雖然沒什麼業務,不過還是有些手足無措。主要是真上陣了還是有些恐慌吧。 交接手續真的非常麻煩。 聽他們說,不久之後他們要去插秧什麼的,據說是黨日活動,我真心覺得有些麻,這都搞的什麼麽蛾子。前陣子還說要買扶貧戶的產品,為了完成任務,一個人攤下來得有 660 塊 ...
  • 本系列深入分析編譯器對於C++虛函數的底層實現,最後分析C++在多態的情況下的性能是否有受影響,多態究竟有多大的性能損失。 ...
  • docker網路規劃 docker network create kafka-net --subnet 172.20.0.0/16 docker network ls zookeeper1(172.20.0.11 2184:2181) zookeeper2(172.20.0.12 2185:2181 ...
  • 距離golang 1.23發佈還有兩個月不到,按照慣例很快要進入1.23的功能凍結期了。在凍結期間不會再添加新功能,已經添加的功能不出大的意外一般也不會被移除。這正好可以讓我們提前嘗鮮這些即將到來的新特性。 今天要說的就是1.23中對//go:linkname指令的變更。這個新特性可以說和我的一次失 ...
  • 目錄條款26:儘可能延後變數定義式的出現時間(Postpone variable definitions as long as possible)條款27:儘量少做轉型動作(Minimize casting)條款28:避免返回handles指向對象內部成分(Avoid returning “hand ...
  • 營業執照識別介面是一種通過API實現的功能,可以對不同版式的營業執照進行識別,提取其中的證件編號、社會信用代碼、單位名稱、地址、法人、類型、成立日期、有效日期、經營範圍等關鍵欄位。這個功能在很多場景下都可以發揮作用,比如在企業註冊、信用查詢、合作伙伴選擇等方面。 首先,我們需要瞭解API是什麼。AP ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...