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帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!