Spring中IOC的启动过程

  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中

    创建DefaultListableBeanFactory工厂,给bean工厂设置一些属性,加载配置文件信息,封装成bean定义信息


  3. prepareBeanFactory(beanFactory)

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

    设置bean工厂的一些属性,如添加一些BeanPostProcessor增强器等


  4. postProcessorBeanFactory(beanFactory)

    模板方法,留给子类拓展实现


  5. invokeBeanFactoryPostProcessors(beanFactory)

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

    执行BeanFactoryPostProcessor的postProcessorBeanFactory()增强方法


  6. registerBeanPostProcessors(beanFactory)

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

    注册BeanPostProcessor增强器 只是注册,真正执行是在初始化阶段的前后执行


  7. initMessageSource()

    初始化MessageSource,国际化处理


  8. initApplicationEventMulticaster()

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

    初始化事件多播器


  9. onRefresh()

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

    模板方法,留给子类扩展实现


  10. registerListeners()

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

    注册一些监听器


  11. finishBeanFactorylnitialization(beanFactory)

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

    IOC容器创建最重要的一个步骤:完成非懒加载的单例bean对家的实例化,包括反射创建bean对象、属性填充、循环依赖的处理、bean的初始化等等


  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的生命周期也是从这里开始的;

    具体一点就是说,这里会获取到之前解析到的所有bean名称集合,挨个调用getBean(beanName)方法,然后经历doGetBean()、createBean()、doCreateBean()创建bean的流程,接着会通过反射创建出我们的bean实例对象,然后进行populateBean()属性填充,属性填充完成后,会执行bean的初始化,初始化bean过程主要执行Aware接口方法、执行初始化方法、回调BeanPostProcessor后置增强器的方法等。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值