【Java面試】@Resource 和 @Autowired 的區別

跟著Mic學架構發表於2022-06-22

Hi,大家好,我是Mic。

一個工作2年的粉絲,問我一個Spring裡面的問題。

希望我能從不同的視角去分析,然後碾壓面試官。

這個問題是: “@Resource和@Autowired”的區別。

下面看看普通人和高手的回答

普通人:

@Resource和@Autowired的區別我認為是在它們的一個注入的一個方式上

@Resource它是根據name來進行注入的,@Autowired是根據型別來注入的。

高手:

好的,面試官。

@Resource和@Autowired這兩個註解的作用都是在Spring生態裡面去實現Bean的依賴注入。

下面我分別說一下@Autowired和@Resource這兩個註解。

閃現 [@Autowired的作用詳解 ] 幾個字。

首先,@Autowired是Spring裡面提供的一個註解,預設是根據型別來實現Bean的依賴注入。

@Autowired註解裡面有一個required屬性預設值是true,表示強制要求bean例項的注入,

在應用啟動的時候,如果IOC容器裡面不存在對應型別的Bean,就會報錯。

當然,如果不希望自動注入,可以把這個屬性設定成false。

carbon_20220512164812

其次呢, 如果在Spring IOC容器裡面存在多個相同型別的Bean例項。由於@Autowired註解是根據型別來注入Bean例項的

carbon_20220512164814

所以Spring啟動的時候,會提示一個錯誤,大概意思原本只能注入一個單例項Bean,

但是在IOC容器裡面卻發現有多個,導致注入失敗。

carbon_20220512164813

當然,針對這個問題,我們可以使用 @Primary或者@Qualifier這兩個註解來解決。

@Primary表示主要的bean,當存在多個相同型別的Bean的時候,優先使用宣告瞭@Primary的Bean。

@Qualifier的作用類似於條件篩選,它可以根據Bean的名字找到需要裝配的目標Bean。

carbon_20220512164815

閃現 [@Resource的作用詳解 ] 幾個字。

接下來,我再解釋一下@Resource註解。

@Resource是JDK提供的註解,只是Spring在實現上提供了這個註解的功能支援。

它的使用方式和@Autowired完全相同,(如圖)最大的差異於@Resource可以支援ByName和ByType兩種注入方式。

如果使用name,Spring就根據bean的名字進行依賴注入,如果使用type,Spring就根據型別實現依賴注入。

如果兩個屬性都沒配置,就先根據定義的屬性名字去匹配,如果沒匹配成功,再根據型別匹配。兩個都沒匹配到,就報錯。

carbon_20220512164816

最後,我再總結一下。

  • @Autowired是根據type來匹配,@Resource可以根據name和type來匹配,預設是name匹配。
  • @Autowired是Spring定義的註解,@Resource是JSR 250規範裡面定義的註解,而Spring對JSR 250規範提供了支援。
  • @Autowired如果需要支援name匹配,就需要配合@Primary或者@Qualifier來實現。

以上就是我對這個問題的理解。

總結

大家可以關注高手部分的回答,他的邏輯結構很清晰的。

他是非常直觀的告訴面試官這兩個註解的差異,同時又基於兩個註解的特性解釋了更多的差異。

最後做了一個簡短的總結。

大家在面試的時候可以參考類似的回答思路。

喜歡我的作品的小夥伴記得點贊和收藏加關注。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!

相關文章