描述: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对象