spring-beans模块分析

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

                               

猜你喜欢

转载自blog.csdn.net/zuojunyuan/article/details/89091188