Hi,大家好,我是Mic
一個工作3年的粉絲,早上6點給我微信發語音,把我直接嚇醒。
我以為什麼天大的事情,結果一問才知道。
面試官問了他一個問題沒答上來,問題是“Spring裡面,如果兩個id相同的bean會報錯嗎?如果會,在哪個階段報錯?”
下面看看普通人和高手的回答!
普通人:
兩個id相同的bean應該會報錯因為在Spring IOC容器裡面,它的id一定是唯一的吧。如果說有兩個相同的id的話那就會存在找不到,就是說我們去找一個bean的時候,他會根據名字來找,要麼根據型別。
在哪個階段的話。。。應該是在spring啟動的時候吧。
高手:
好的,關於這個問題,我從幾個點來回答。
首先,在同一個XML配置檔案裡面,不能存在id相同的兩個bean,否則spring容器啟動的時候會報錯。
因為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這個例項,後續相同名字的例項不會再載入。
如果使用@Autowired註解根據型別實現依賴注入,因為IOC容器只有UserService01的例項,所以啟動的時候會提示找不到UserService02這個例項。
如果使用@Resource註解根據名詞實現依賴注入,在IOC容器裡面得到的例項物件是UserService01,
於是Spring把UserService01這個例項賦值給UserService02,就會提示型別不匹配錯誤。
這個錯誤,是在Spring IOC容器裡面的Bean初始化之後的依賴注入階段發生的。
以上就是我對這個問題的理解。
總結
你看,一個小小的面試題,竟然涉及到這麼多知識點。
有些粉絲會問,這個我已經會用了,問這個問題的意義在哪裡?
其實很多剛工作1~2年的小夥伴,如果出現使用不當很容易出現各種異常。
而對Spring有足夠深入的理解,可以快速解決各種異常。
喜歡我的作品的小夥伴記得點贊和收藏加關注。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!