天天看點

springIOC的源碼流程

springIOC的源碼流程

IOC:

  1. IOC是一個容器
  2. 容器啟動時建立所有單執行個體對象
  3. 我們可以直接從容器中擷取到這個對象

SpringIOC:

  1. IOC容器的啟動過程?啟動期間都做了什麼(什麼時候建立所有單執行個體bean)
  2. IOC是如何建立這些單執行個體bean,并如何管理的;到底儲存在哪裡?
springIOC的源碼流程
springIOC的源碼流程

主要以debug方式将流程走一遍

先建立出Car類,用@Component将Car類注入ioc容器中,在測試類中通過new AnnotationConfigApplicationContext(Car.class);注解方式擷取到Car的bean。

debug進去會看到下圖

springIOC的源碼流程

this.refresh()為主要初始化的方法,調用來至父類AbstractApplicationContext中的模版方法refresh()方法,進入到this.refresh() 後會跳到AbstractApplicationContext類中

springIOC的源碼流程

點選this.finishBeanFactoryInitialization(beanFactory)跳轉

springIOC的源碼流程

前面的判斷為檢測初始化環境,點選進入beanFactory.preInstantiateSingletons();會進入到DefaultListableBeanFactory

springIOC的源碼流程
springIOC的源碼流程

循環一次則建立一個bean執行個體,以上就是ioc容器的建立單執行個體bean的過程,後續則是getBean的細節部分,測試類中的getBean()也是以下流程,具體細節不一樣

點選getBean(BeanName),進入到AbstractBeanFactory類中

springIOC的源碼流程
springIOC的源碼流程
springIOC的源碼流程
springIOC的源碼流程
springIOC的源碼流程

直接進入到getSingleton()方法中

springIOC的源碼流程
springIOC的源碼流程
springIOC的源碼流程

觀察控制台,已經列印了car construction…

springIOC的源碼流程
springIOC的源碼流程

建立好的對象最終會儲存在一個map中;DefaultSingletonBeanRegistry-singletonObjects