【Java面試】介紹下Spring IoC的工作流程

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

Hi,我是Mic

一個工作了4年的粉絲,在面試的時候遇到一個這樣的問題。

“介紹一下Spring IOC的工作流程”

他說回答得不是很好,希望我能幫他梳理一下。

關於這個問題,我們來看看普通人和高手的回答。

普通人:

嗯。。。。。。。。

高手:

好的,這個問題我會從幾個方面來回答。

  • IOC是什麼
  • Bean的宣告方式
  • IOC的工作流程

IOC的全稱是Inversion Of Control, 也就是控制反轉,它的核心思想是把物件的管理許可權交給容器。

應用程式如果需要使用到某個物件例項,直接從IOC容器中去獲取就行,這樣設計的好處是降低了程式裡面物件與物件之間的耦合性。

使得程式的整個體系結構變得更加靈活。

image-20220510095942810

image-20220510100014497

Spring裡面很多方式去定義Bean,比如XML裡面的標籤、@Service、@Component、@Repository、@Configuration配置類中的@Bean註解等等。

Spring在啟動的時候,會去解析這些Bean然後儲存到IOC容器裡面。

image-20220510101204396

Spring IOC的工作流程大致可以分為兩個階段。

第一個階段,就是IOC容器的初始化

這個階段主要是根據程式中定義的XML或者註解等Bean的宣告方式

通過解析和載入後生成BeanDefinition,然後把BeanDefinition註冊到IOC容器。

image-20220510121115810

通過註解或者xml宣告的bean都會解析得到一個BeanDefinition實體,實體中包含這個bean中定義的基本屬性。

最後把這個BeanDefinition儲存到一個Map集合裡面,從而完成了IOC的初始化。

IoC容器的作用就是對這些註冊的Bean的定義資訊進行處理和維護,它IoC容器控制反轉的核心。

第二個階段,完成Bean初始化及依賴注入

然後進入到第二個階段,這個階段會做兩個事情

  1. 通過反射針對沒有設定lazy-init屬性的單例bean進行初始化。
  2. 完成Bean的依賴注入。

image-20220510115646893

第三個階段,Bean的使用

通常我們會通過@Autowired或者BeanFactory.getBean()從IOC容器中獲取指定的bean例項。

另外,針對設定layy-init屬性以及非單例bean的例項化,是在每次獲取bean物件的時候,呼叫bean的初始化方法來完成例項化的,並且Spring IOC容器不會去管理這些Bean。

image-20220511103240376

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

總結

對於工作原理或者工作流程性的問題,大家一定要注意回答的結構和節奏。

否則面試官會覺得很混亂,無法理解,導致面試的效果大打折扣。

高手的回答邏輯非常清晰,大家可以參考。

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

file

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

相關文章