【Java面試】Spring 中,有兩個 id 相同的 bean,會報錯嗎,如果會報錯,在哪個階段報錯

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

Hi,大家好,我是Mic

一個工作3年的粉絲,早上6點給我微信發語音,把我直接嚇醒。

我以為什麼天大的事情,結果一問才知道。

面試官問了他一個問題沒答上來,問題是“Spring裡面,如果兩個id相同的bean會報錯嗎?如果會,在哪個階段報錯?”

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

普通人:

兩個id相同的bean應該會報錯因為在Spring IOC容器裡面,它的id一定是唯一的吧。如果說有兩個相同的id的話那就會存在找不到,就是說我們去找一個bean的時候,他會根據名字來找,要麼根據型別。

在哪個階段的話。。。應該是在spring啟動的時候吧。

高手:

好的,關於這個問題,我從幾個點來回答。

首先,在同一個XML配置檔案裡面,不能存在id相同的兩個bean,否則spring容器啟動的時候會報錯。

carbon_20220512164817

因為id這個屬性表示一個Bean的唯一標誌符號,所以Spring在啟動的時候會去驗證id的唯一性,一旦發現重複就會報錯,

這個錯誤發生Spring對XML檔案進行解析轉化為BeanDefinition的階段。

但是在兩個不同的Spring配置檔案裡面,可以存在id相同的兩個bean。 IOC容器在載入Bean的時候,預設會多個相同id的bean進行覆蓋。

在Spring3.x版本以後,這個問題發生了變化

我們知道Spring3.x裡面提供@Configuration註解去宣告一個配置類,然後使用@Bean註解實現Bean的宣告,這種方式完全取代了XMl。

在這種情況下,如果我們在同一個配置類裡面宣告多個相同名字的bean,在Spring IOC容器中只會註冊第一個宣告的Bean的例項。

後續重複名字的Bean就不會再註冊了。

像這樣一段程式碼,在Spring IOC容器裡面,只會儲存UserService01這個例項,後續相同名字的例項不會再載入。

carbon_20220512164818

如果使用@Autowired註解根據型別實現依賴注入,因為IOC容器只有UserService01的例項,所以啟動的時候會提示找不到UserService02這個例項。

carbon_20220512164820

如果使用@Resource註解根據名詞實現依賴注入,在IOC容器裡面得到的例項物件是UserService01,

於是Spring把UserService01這個例項賦值給UserService02,就會提示型別不匹配錯誤。

carbon_20220512164819

這個錯誤,是在Spring IOC容器裡面的Bean初始化之後的依賴注入階段發生的。

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

總結

你看,一個小小的面試題,竟然涉及到這麼多知識點。

有些粉絲會問,這個我已經會用了,問這個問題的意義在哪裡?

其實很多剛工作1~2年的小夥伴,如果出現使用不當很容易出現各種異常。

而對Spring有足夠深入的理解,可以快速解決各種異常。

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

file

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

相關文章