描述:spring-beans負責實現Spring框架的IOC模塊
UML結構圖如下:
AbstractBeanFactory:BeanFactory接口的抽象實現類,提供了ConfigurableBeanFactory 完整SPI。
通過DefaultSingletonBeanRegistry實現了單例緩存(singleton cache).
實現了通過FactoryBean判斷bean類型(singleton/prototype)功能,處理,別名和合并bean definition功能,創建,獲取和銷毀bean對象功能,內部引用了parentBeanFactory對象,實現了BeanFactory的雙親委派結構
核心方法:
1.createBean
整體流程如下:
resloveBeanClass具體實現:返回RootBeanDefinition對象的beanClass屬性或者其他的classloader根據RootBeanDefinition對象的beanClassName屬性解析出的Class<?>
resloveBeforeInstantiation具體實現:遍歷beanFactory對象的beanPostProcessors列表兩次,對當前bean分別遞歸調用beanPostProcessor接口的postProcessBeforeInstantiation(轉化為InstantiationAwareBeanPostProcessor類型)和 postProcessAfterInitialization方法(上一次接口調用的返回值作為下一次接口調用的請求)
doCreateBean具體實現:
createBeanInstance具體實現如下:
1.如果RootBeanDefinition對象定義了instanceSupplier屬性,返回instanceSupplier.get()
2.如果RootBeanDefinition對象的factoryMethodName屬性不為空,返回通過factoryMethod方法構造的實例
3.如果RootBeanDefinition對象的resolvedConstructorOrFactoryMethod屬性不為空,返回通過特定方式構造的實例
4.遍歷beanPostProcessor(轉化為SmartInstantiationAwareBeanPostProcessor)列表,使用determineCandidateConstructors(beanClass, beanName)獲取特定構造器,返回特定構造器返回的實例
5.返回無參構造器
AbstractApplicationContext:org.springframework.context.ApplicationContext接口的抽象實現,用于創建或者刷新IOC容器
核心方法:
1.refresh
創建或者刷新IOC容器
執行流程如下:
1.1 prepareBeanFactory詳解
流程如下:
1.2 invokeBeanFactoryPostProcessors詳解
流程如下:
備注:如果beanFactory是BeanDefinitionRegistry類型的話,在beanFactoryPostProcessors和beanFactory查找BeanDefinitionRegistryPostProcessor類型,并執行相應方法
1.3 登記ApplicationListener對象
ApplicationListener類型UML結構圖如下:
1.4 初始化BeanFactory中定義的singleton對象
AbstractRefreshableApplicationContext:默認使用DefaultListableBeanFactory類型
AbstractRefreshableWebApplicationContext:面向web環境的ApplicationContext,主要涉及到ServletContext和ServletConfig
ServletContextAwareProcessor:
備注:將bean轉換為ServletContextAware類型,并設置對應ServletContext和ServletConfig參數
XmlWebApplicationContext:使用xml配置加載bean對象