源码解读(二): spring容器初始化的refresh操作

来源:互联网 发布:算法图解 pdf百度网盘 编辑:程序博客网 时间:2024/06/09 09:08

在上一篇文章 源码解读(一): spring在web容器中的初始化过程 中,我们了解了Spring容器的初始化整个过程,但是你看了之后可能会有疑问。既然到这个时候初始化都已经完成了,那么bean的初始化应该从什么时候开始呢?不要着急,在上一篇文章中,ContextLoader中的ConfigureAndRefreshWebApplicationContext中的最后一步方法refresh操作中设定了BeanFactory,整个bean的生命周期也从这个方法中开始。下面,我们将详细讲解refresh方法到底做了什么。

wac.refresh();
  1. refresh方法的实现类是抽象类AbstractApplicationContext,继承了ConfigurableApplicationContext等接口。AbstractApplicationContext采用模板方法模式,把一部分实现推迟到子类。refresh方法同样是一个模板方法。
    AbstractApplicationContext定义

  2. 下面我们先总体了解一下refresh方法的内容。大体来说,refresh方法的作用是创建加载Spring IOC容器相关配置,是IOC的入口。“在创建IOC容器前,如果已经有容器存在,则需要把已有的容器销毁和关闭,以保证在refresh之后使用的是新建立起来的IoC容器。refresh的作用类似于对IoC容器的重启,在新建立好的容器中对容器进行初始化,对Bean定义资源进行载入。”
    refresh

  3. prepareRefresh():调用容器准备刷新的方法,获取容器的当时时间,同时给容器设置同步标识。initPropertySources()方法由抽象子类AbstractRefreshableApplicationContext实现。
    prepareRefresh

  4. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory() :告诉子类启动refreshBeanFactory()方法,Bean定义资源文件的载入从子类的refreshBeanFactory()方法启动 。refreshBeanFactory()方法由子类AbstractRefreshableApplicationContext实现。
    obtainFreshBeanFactory

    • refreshBeanFactory()方法的主要作用在于根据当前应用上下文信息重新创建一个beanFactory,如果已经存在beanFactory,则把旧的beanFactory关闭。保证每次刷新都是新的beanFactory。
      refreshBeanFactory

    • loadBeanDefinitions由子类XmlWebApplicationContext实现。
      loadBeanDefinitions

    • 读取web.xml中的配置文件,通过配置文件装载bean。
      这里写图片描述

    • reader.loadBeanDefinitions()方法由AbstractBeanDefinitionReader子类实现。XmlBeanDefinitionReader继承了AbstractBeanDefinitionReader,所以AbstractBeanDefinitionReader共享XmlBeanDefinitionReader的beanFactory对象,对应的resourceLoader即为beanFactory的子类BeanDefinitionRegistry的值。
      这里写图片描述

    下面是我根据loadBeanDefinitions的过程画的时序图,中间有些类和方法有所省略。点击此处查看大图
    loadBeanDefinitions时序图

  5. invokeBeanFactoryPostProcessors(beanFactory):实例化并调用在Context中注册为BeanFactoryPostProcessor的beans。例如:org.springframework.context.annotation.internalConfigurationAnnotationProcessororg.mybatis.spring.mapper.MapperScannerConfigurer等。这其中以及之后涉及到的实例化bean的方法,之后我们会开一章详细讲解doGetBean()方法。

  6. registerBeanPostProcessors(beanFactory):实例化并调用在Context中注册为BeanPostProcessor的beans,拦截bean的创建。

  7. initMessageSource():初始化MessageSource

  8. initApplicationEventMulticaster():初始化 event multicaster

  9. onRefresh():具体的子类初始化其他特别的beans

  10. registerListeners():检查监听器beans并注册他们

  11. finishBeanFactoryInitialization(beanFactory):初始化所有的non-lazy-init单例

  12. finishRefresh():完成刷新,调用LifecycleProcessor的onRefresh()方法并发布ContextRefreshedEvent事件

0 0
原创粉丝点击