描述: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结构图如下:
类型名 | 描述 | 具体实现 |
---|---|---|
ContextRefreshListener | 只接收WebApplicationContext发出的消息,提供了扩展点供子类使用 | 委托给FrameworkServlet对象调用onApplicationEvent方法 |
ApplicationListenerMethodTransactionalAdapter | 调用添加了TransactionalEventListener注解的spring bean对象方法(提供了如何实现灵活调用系统扩展点的思路) | |
ApplicationListenerMethodAdapter | 调用添加了EventListener注解的spring bean对象方法 | |
GenericApplicationListenerAdapter | 代理模式实现事件类型和监听器匹配 |
1.4 初始化BeanFactory中定义的singleton对象
AbstractRefreshableApplicationContext:默认使用DefaultListableBeanFactory类型
AbstractRefreshableWebApplicationContext:面向web环境的ApplicationContext,主要涉及到ServletContext和ServletConfig
ServletContextAwareProcessor:
备注:将bean转换为ServletContextAware类型,并设置对应ServletContext和ServletConfig参数
XmlWebApplicationContext:使用xml配置加载bean对象