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,

其次呢, 如果在Spring IOC容器里面存在多個相同型別的Bean實體,由于@Autowired注解是根據型別來注入Bean實體的

所以Spring啟動的時候,會提示一個錯誤,大概意思原本只能注入一個單實體Bean,
但是在IOC容器里面卻發現有多個,導致注入失敗,

當然,針對這個問題,我們可以使用 @Primary或者@Qualifier這兩個注解來解決,
@Primary表示主要的bean,當存在多個相同型別的Bean的時候,優先使用宣告了@Primary的Bean,
@Qualifier的作用類似于條件篩選,它可以根據Bean的名字找到需要裝配的目標Bean,

閃現 [@Resource的作用詳解 ] 幾個字,
接下來,我再解釋一下@Resource注解,
@Resource是JDK提供的注解,只是Spring在實作上提供了這個注解的功能支持,
它的使用方式和@Autowired完全相同,(如圖)最大的差異于@Resource可以支持ByName和ByType兩種注入方式,
如果使用name,Spring就根據bean的名字進行依賴注入,如果使用type,Spring就根據型別實作依賴注入,
如果兩個屬性都沒配置,就先根據定義的屬性名字去匹配,如果沒匹配成功,再根據型別匹配,兩個都沒匹配到,就報錯,

最后,我再總結一下,
- @Autowired是根據type來匹配,@Resource可以根據name和type來匹配,默認是name匹配,
- @Autowired是Spring定義的注解,@Resource是JSR 250規范里面定義的注解,而Spring對JSR 250規范提供了支持,
- @Autowired如果需要支持name匹配,就需要配合@Primary或者@Qualifier來實作,
以上就是我對這個問題的理解,
總結
大家可以關注高手部分的回答,他的邏輯結構很清晰的,
他是非常直觀的告訴面試官這兩個注解的差異,同時又基于兩個注解的特性解釋了更多的差異,
最后做了一個簡短的總結,
大家在面試的時候可以參考類似的回答思路,
喜歡我的作品的小伙伴記得點贊和收藏加關注,
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/494384.html
標籤:其他
