最近有空把Spring加載bean流程複習了一下,也乘機可以做個整理.首先還是看下入口代碼,本文主要講解析及註冊BeanDefinition整體加載流程:
ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext("app.xml");
ClassPathXmlApplicationContext的類圖繼承關係如下:
類圖可以方便的清楚該類的繼承關係,利於閱讀源碼. 一步步跟進去,AbstractApplicationContext中的refresh()方法,便是IOC容器初始化的入口,該方法中調用的obtainFreshBeanFactory()方法,是載入Bean定義的資源文件,該文是分析該類的調用流程,本文使用spring版本爲 4.2.4.RELEASE
,obtainFreshBeanFactory()中調用了AbstractApplicationContext子類AbstractRefreshableApplicationContext#refreshBeanFactory中的refreshBeanFactory()方法,這是 委派設計模式,具體實現由子類做.下面是整個調用層次關係圖:
在DefaultListableBeanFactory類中的registerBeanDefinition方法內,註冊了BeanDefinition信息:
this.beanDefinitionMap.put(beanName, beanDefinition);
DefaultListableBeanFactory是Spring Bean加載中的核心類,現在不分析加載過程中細節,後面的章節會剖析.