springIOC的源碼流程
IOC:
- IOC是一個容器
- 容器啟動時建立所有單執行個體對象
- 我們可以直接從容器中擷取到這個對象
SpringIOC:
- IOC容器的啟動過程?啟動期間都做了什麼(什麼時候建立所有單執行個體bean)
- IOC是如何建立這些單執行個體bean,并如何管理的;到底儲存在哪裡?
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR90MBpXT3VFVOBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0kDOyMjMwETM2IzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
主要以debug方式将流程走一遍
先建立出Car類,用@Component将Car類注入ioc容器中,在測試類中通過new AnnotationConfigApplicationContext(Car.class);注解方式擷取到Car的bean。
debug進去會看到下圖
this.refresh()為主要初始化的方法,調用來至父類AbstractApplicationContext中的模版方法refresh()方法,進入到this.refresh() 後會跳到AbstractApplicationContext類中
點選this.finishBeanFactoryInitialization(beanFactory)跳轉
前面的判斷為檢測初始化環境,點選進入beanFactory.preInstantiateSingletons();會進入到DefaultListableBeanFactory
循環一次則建立一個bean執行個體,以上就是ioc容器的建立單執行個體bean的過程,後續則是getBean的細節部分,測試類中的getBean()也是以下流程,具體細節不一樣
點選getBean(BeanName),進入到AbstractBeanFactory類中
直接進入到getSingleton()方法中
觀察控制台,已經列印了car construction…
建立好的對象最終會儲存在一個map中;DefaultSingletonBeanRegistry-singletonObjects