Hi,我是Mic
一個工作了4年的粉絲,在面試的時候遇到一個這樣的問題。
“介紹一下Spring IOC的工作流程”
他說回答得不是很好,希望我能幫他梳理一下。
關於這個問題,我們來看看普通人和高手的回答。
普通人:
嗯。。。。。。。。
高手:
好的,這個問題我會從幾個方面來回答。
- IOC是什麼
- Bean的宣告方式
- IOC的工作流程
IOC的全稱是Inversion Of Control, 也就是控制反轉,它的核心思想是把物件的管理許可權交給容器。
應用程式如果需要使用到某個物件例項,直接從IOC容器中去獲取就行,這樣設計的好處是降低了程式裡面物件與物件之間的耦合性。
使得程式的整個體系結構變得更加靈活。
Spring裡面很多方式去定義Bean,比如XML裡面的<bean>標籤、@Service、@Component、@Repository、@Configuration配置類中的@Bean註解等等。
Spring在啟動的時候,會去解析這些Bean然後儲存到IOC容器裡面。
Spring IOC的工作流程大致可以分為兩個階段。
第一個階段,就是IOC容器的初始化
這個階段主要是根據程式中定義的XML或者註解等Bean的宣告方式
通過解析和載入後生成BeanDefinition,然後把BeanDefinition註冊到IOC容器。
通過註解或者xml宣告的bean都會解析得到一個BeanDefinition實體,實體中包含這個bean中定義的基本屬性。
最後把這個BeanDefinition儲存到一個Map集合裡面,從而完成了IOC的初始化。
IoC容器的作用就是對這些註冊的Bean的定義資訊進行處理和維護,它IoC容器控制反轉的核心。
第二個階段,完成Bean初始化及依賴注入
然後進入到第二個階段,這個階段會做兩個事情
- 通過反射針對沒有設定lazy-init屬性的單例bean進行初始化。
- 完成Bean的依賴注入。
第三個階段,Bean的使用
通常我們會通過@Autowired或者BeanFactory.getBean()從IOC容器中獲取指定的bean例項。
另外,針對設定layy-init屬性以及非單例bean的例項化,是在每次獲取bean物件的時候,呼叫bean的初始化方法來完成例項化的,並且Spring IOC容器不會去管理這些Bean。
以上就是我對這個問題的理解。
總結
對於工作原理或者工作流程性的問題,大家一定要注意回答的結構和節奏。
否則面試官會覺得很混亂,無法理解,導致面試的效果大打折扣。
高手的回答邏輯非常清晰,大家可以參考。
喜歡我的作品的小夥伴記得點贊和收藏加關注。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!