0
点赞
收藏
分享

微信扫一扫

Spring中IOC的启动过程

忆北文学摄影爱好员 2022-02-24 阅读 76
  1. prepareRefresh()

    1. 设置容器启动时间
    2. 设置一些状态位标识,如active、closed
    3. 初始化占位符属性资源
    4. 创建环境对象,校验必填属性是否可解析
    5. 初始化一些成员变量,如earlyApplicationListeners(应用监听器)、earlyApplicationEvents(应用事件)

  2. obtainFreshBeanFactory()

    1. 创建bean工厂,类型是DefaultListableBeanFactory
    2. 设置bean工厂的序列化id
    3. 定制化bean工厂,其实也是设置一些属性,如allowBeanDefinitonOverring(bean定义信息是否可以重写)、allowCircularReferences(是否运行循环依赖)
    4. 加载bean定义信息,初始化BeanDifinitonReader读取器,将配置文件转化成输入流对象,通过SAX解析XML文件中的默认标签以及自定义标签内容,封装成BeanDefiniton,注册到DefaultListableBeanFactory的beanDefinitonMap中

  3. prepareBeanFactory(beanFactory)

    1. 设置bean类加载器信息
    2. 添加一些BeanPostProcessor增强器
    3. 忽略一些接口的自动装配依赖
    4. 注册一些bean对象到容器中,如environment(环境变量)、systemProperties(系统属性)等

  4. postProcessorBeanFactory(beanFactory)


  5. invokeBeanFactoryPostProcessors(beanFactory)

    1. 调用实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessors
    2. 调用实现了Ordered接口的BeanDefinitionRegistryPostProcessors
    3. 其它BeanDefinitionRegistryPostProcessors
    4. 调用实现了PriorityOrdered接口的BeanFactoryPostProcessor
    5. 调用实现了Ordered接口的BeanFactoryPostProcessor
    6. 调用其它BeanFactoryPostProcessor

  6. registerBeanPostProcessors(beanFactory)

    1. 注册实现了PriorityOrdered接口的BeanPostProcessor
    2. 注册实现了Ordered接口的BeanPostProcessor
    3. 注册其它BeanPostProcessor

  7. initMessageSource()


  8. initApplicationEventMulticaster()

    1. 如果容器中存在applicationEventMulticaster,则直接获取,否则创建一个新的SimpleApplicationEventMulticaster, 并注册到容器中

  9. onRefresh()

    1. 在单例对象的实例化之前,允许子类做一下扩展

  10. registerListeners()

    1. 玩applicationEventMulticaster事件多播器中注册一系列监听器

  11. finishBeanFactorylnitialization(beanFactory)

    1. 循环遍历之前解析后的BeanDefinition定义信息
    2. 通过反射创建bean对象
    3. bean的属性填充popularBean()
    4. 调用Aware按口相关方法,如BeanNameAware.BeanFactoryAware等
    5. 执行BeanPostProcessor的postProcessBeforelnitialization()前置增强方法
    6. 执行InitializaingBean的afterPropertiesset()方法
    7. 执行自定义的初始化方法,如init-method等
    8. 执行BeanPostProcessor的postProcessAfterinitialization()后置增强方法
    9. 执行DisposableBean的destroy()销毁方法
    10. 执行自定义的销毁方法,如destroy-method等

  12. finishRefresh()

    1. 清除资源缓存
    2. 初始化生命周期处理器,调用onRefresh()刷新方法
    3. 发布容器己刷新事件

总结

  1. 第一步,首先会执行一些容器刷新前的准备工作,如设置容器启动时间、一些状态标志位等;

  2. 第二步,创建容器对象,其实就是实例化DefaultListableBeanFactory对象,这一步包含了bean定义信息的解析,解析后的属性都封装到DefaultListableBeanFactory的成员属性中了,如我们常见的beanDefinitionMap、beanDefinitionNames:

  3. 第三步,准备Bean工厂,实际上就是设置beanFactory的一些属性;

  4. 第四步,Spring提供了postProcessBeanFactory()方法给我们去扩展,例如我们可以注册一些特殊的BeanPostProcessor后置处理器等操作;

  5. 第五步,执行BeanFactoryPostProcessor后置处理器的postProcessBeanFactory()增强方法,使用三个不同的集合分别存放实现了PriorityOrdered接口、实现了Ordered接口、普通的BeanFactoryPostProcessor,经过排序后,执行BeanFactoryPostProcessor的回调postProcessBeanFactory();

  6. 第六步,注册BeanPostProcessor后置处理器,注意,这里还不会执行BeanPostProcessor对应的增强方法;同样的,使用三个不同的集合分别存放实现了PriorityOrdered接口、实现了Ordered接口、普通的BeanPostProcessor,依次调用beanFactory.addBeanPostProcessor(postProcessor)方法往bean工厂中添加BeanPostProcessor:

  7. 第七步,为上下文初始化MessageSource,即国际化处理;

  8. 第八步,初始化事件多播器,即Application EventMulticaster, 为后面的事件发布-监听做准备;

  9. 第九步,提供了一个模板方法onRefresh(),留给子类初始化其他的bean;

  10. 第十步,注册Listener监听器;

  11. 第十一步,也是最关键的一步,这里会实例化所有剩下的非懒加载的单例Bean,Bean的生命周期也是从这里开始的;

  12. 第十二步,完成上下文的刷新工作,如清除些缓存、发布容器刷新完成的事件等;

举报

相关推荐

0 条评论