Spring应用上下文启动准备阶段

  • AbstractApplicationContext#prepareRefresh()方法

1.启动时间startupDate
2.状态标识closed、active
3.初始化PropertySources-initPropertySources()
4.检验Environment中必须属性
5.初始化事件监听器集合
6.初始化早期Spring事件集合

BeanFactory创建阶段

  • AbstarctApplicationContext#obtainFreshBeanFactory()方法

1.刷新Spring应用上下文底层BeanFactory-refreshBeanFactory()

• 销毁或关闭BeanFactory,如果已存在的话
• 设置BeanFactory-createBeanFactory
• 设置BeanFactoryId
• 设置是否允许BeanDefinition重复定义-customizeBeanFactory(DefaultListableBeanFactory)
• 设置是否允许循环引用-customizeBeanFactory(DefaultListableBeanFactory)
• 加载BeanDefinition-loadBeanDefinitions(DefaultListableBeanFactory)方法
• 关联新增BeanFactory到Spring应用上下文

2.返回Spring应用上下文底层BeanFactory-getBeanFactory()

BeanFactory准备阶段

  • AbstractApplicationContext#prepareBeanFactory(ConfigurableListableBeanFactory)方法
1.关联ClassLoader
 2.设置Bean表达式处理器
 3.添加PropertyEditorRegistrar实现–ResourceEditorRegistrar
 4.添加Ware回调接口BeanPostProcessor实现–ApplicationContextAwareProcessor
 5.忽略Aware回调接口作为依赖注入接口
 6.注册ResolvableDependency对象
 7.注册单例对象-Environment、JavaSystemProperties以及OS环境变量

BeanFactory后置处理阶段

    • AbstractApplicationContext#postProcessBeanFactory(ConfigurableListableBeanFactory)方法,由子类覆盖该方法。
    • AbstractApplicationContext#invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory)方法

    1.调用BeanFactoryPostProcessor或BeanDefinitionRegistry后置处理方法

    BeanFactory注册BeanPostProcessor阶段

    注册所有BeanPostProcessor,即调用beanFactory.getBean(String name, Class<?> requiredType)方法获取(没有则会创建)到所有BeanPostProcessor实例,加入到集合中。

    初始化内建Bean:MessageSource

    • AbstractApplicationContext#initMessageSource()方法

    初始化内建Bean:Spring事件广播器

    • AbstractApplicationContext#initApplicationEventMulticaster()方法

    Spring应用上下文刷新阶段

    • AbstractApplicationContext#onRefresh()方法,由子类覆盖此方法。

    Spring事件监听器注册阶段

    • AbstractApplicationContext#registerListeners()方法

    1.添加当前应用上下文所关联的ApplicationListener对象
    2.添加BeanFactory所注册ApplicationListenerBeans
    3.广播早期Spring事件

    BeanFactory初始化完成阶段

    • AbstractApplicationContext#finishBeanFactoryInitialization(ConfigurableListableBeanFactory)方法

    1.BeanFactory关联ConversionService Bean
    2.添加StringValueResolver对象

    // Register a default embedded value resolver if no bean post-processor
    // (such as a PropertyPlaceholderConfigurer bean) registered any before:
    // at this point, primarily for resolution in annotation attribute values.
    if (!beanFactory.hasEmbeddedValueResolver()) {
        beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
    }
    3.依赖查找LoadTimeWeaverAwareBean

    4.BeanFactory临时ClassLoader置为null
    5.BeanFactory冻结配置
    6.BeanFactory初始化非延迟单例Beans

    Spring应用上下刷新完成阶段

    • AbstractApplicationContext#finishRefresh()方法
    1.清除ResourceLoader缓存
     2.初始化LifecycleProcessor对象
     3.调用LifecycleProcessor#onRefresh()方法
     4.发布Spring应用上下文已刷新事件-ContextRefreshedEvent
     5.向MBeanServer托管LiveBeans

    Spring应用上下文启动阶段

    • AbstractApplicationContext#start()方法

    1.启动LifecycleProcessor: 1.依赖查找LifecycleBeans。2.启动LifecycleBeans

    • 发布Spring应用上下文已启动事件-ContextStartedEvent

    Spring应用上下文停止阶段

    • AbstractApplicationContext#stop()方法

    1.停止LifecycleProcessor: 1.依赖查找Lifecycle Beans。2.停止LifecycleBeans

    • 发送Spring应用上下文已停止事件

    Spring应用上下文关闭阶段

    • AbstractApplicationContext#close()方法
    1.状态标识: active(false)、closed(true)
     2.LiveBeansJMX撤销托管
     3.发布Spring应用上下文已关闭事件-ContextClosedEvent
     4.关闭LifecycleProcessor: 1.依赖查找LifecycBeans。2.停止LifecycleBeans
     5.销毁SpringBeans
     6.关闭BeanFactory
     7.回调onClose()
     8.注册ShutdownHook线程