refresh 是 AbstractApplicationContext 中的一个方法,负责初始化 ApplicationContext 容器,容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法,我们把它们称为 refresh 的 12 个步骤:

1. prepareRefresh

2. obtainFreshBeanFactory

3. prepareBeanFactory

4. postProcessBeanFactory

5. invokeBeanFactoryPostProcessors

6. registerBeanPostProcessors

7. initMessageSource

8. initApplicationEventMulticaster

9. onRefresh

10. registerListeners

11. finishBeanFactoryInitialization

12. finishRefresh

功能分类

1 为准备环境

2 3 4 5 6 为准备 BeanFactory

7 8 9 10 12 为准备 ApplicationContext

11 为初始化 BeanFactory 中非延迟单例 bean

具体步骤

1. prepareRefresh

* 这一步创建和准备了 Environment 对象,它作为 ApplicationContext 的一个成员变量

* Environment 对象的作用之一是为后续 @Value,值注入时提供键值

* Environment 分成三个主要部分

* systemProperties - 保存 java 环境键值

* systemEnvironment - 保存系统环境键值

* 自定义 PropertySource - 保存自定义键值,例如来自于 *.properties 文件的键值

2. obtainFreshBeanFactory

* 这一步获取(或创建) BeanFactory,它也是作为 ApplicationContext 的一个成员变量

* BeanFactory 的作用是负责 bean 的创建、依赖注入和初始化,bean 的各项特征由 BeanDefinition 定义

* BeanDefinition 作为 bean 的设计蓝图,规定了 bean 的特征,如单例多例、依赖关系、初始销毁方法等

* BeanDefinition 的来源有多种多样,可以是通过 xml 获得、配置类获得、组件扫描获得,也可以是编程添加

* 所有的 BeanDefinition 会存入 BeanFactory 中的 beanDefinitionMap 集合

3. prepareBeanFactory

* 这一步会进一步完善 BeanFactory,为它的各项成员变量赋值

* beanExpressionResolver 用来解析 SpEL,常见实现为 StandardBeanExpressionResolver

* propertyEditorRegistrars 会注册类型转换器

* 它在这里使用了 ResourceEditorRegistrar 实现类

* 并应用 ApplicationContext 提供的 Environment 完成 ${ } 解析

* registerResolvableDependency 来注册 beanFactory 以及 ApplicationContext,让它们也能用于依赖注入

* beanPostProcessors 是 bean 后处理器集合,会工作在 bean 的生命周期各个阶段,此处会添加两个:

* ApplicationContextAwareProcessor 用来解析 Aware 接口

* ApplicationListenerDetector 用来识别容器中 ApplicationListener 类型的 bean

4. postProcessBeanFactory

* 这一步是空实现,留给子类扩展。

* 一般 Web 环境的 ApplicationContext 都要利用它注册新的 Scope,完善 Web 下的 BeanFactory

* 这里体现的是模板方法设计模式

5. invokeBeanFactoryPost Processors

* 这一步会调用 beanFactory 后处理器

* beanFactory 后处理器,充当 beanFactory 的扩展点,可以用来补充或修改 BeanDefinition

* 常见的 beanFactory 后处理器有

* ConfigurationClassPostProcessor – 解析 @Configuration、@Bean、@Import、@PropertySource 等

* PropertySourcesPlaceHolderConfigurer – 替换 BeanDefinition 中的 ${ }

* MapperScannerConfigurer – 补充 Mapper 接口对应的 BeanDefinition

6. registerBeanPost Processors

* 这一步是继续从 beanFactory 中找出 bean 后处理器,添加至 beanPostProcessors 集合中

* bean 后处理器,充当 bean 的扩展点,可以工作在 bean 的实例化、依赖注入、初始化阶段,常见的有:

* AutowiredAnnotationBeanPostProcessor 功能有:解析 @Autowired,@Value 注解

* CommonAnnotationBeanPostProcessor 功能有:解析 @Resource,@PostConstruct,@PreDestroy

* AnnotationAwareAspectJAutoProxyCreator 功能有:为符合切点的目标 bean 自动创建代理

7. initMessageSource

* 这一步是为 ApplicationContext 添加 messageSource 成员,实现国际化功能

* 去 beanFactory 内找名为 messageSource 的 bean,如果没有,则提供空的 MessageSource 实现

8. initApplication ContextEventMulticaster

* 这一步为 ApplicationContext 添加事件广播器成员,即 applicationContextEventMulticaster

* 它的作用是发布事件给监听器

* 去 beanFactory 找名为 applicationEventMulticaster 的 bean 作为事件广播器,若没有,会创建默认的事件广播器

* 之后就可以调用 ApplicationContext.publishEvent(事件对象) 来发布事件

9. onRefresh

* 这一步是空实现,留给子类扩展

* SpringBoot 中的子类在这里准备了 WebServer,即内嵌 web 容器

* 体现的是模板方法设计模式

10. registerListeners

* 这一步会从多种途径找到事件监听器,并添加至 applicationEventMulticaster

* 事件监听器顾名思义,用来接收事件广播器发布的事件,有如下来源

* 事先编程添加的

* 来自容器中的 bean

* 来自于 @EventListener 的解析

* 要实现事件监听器,只需要实现 ApplicationListener 接口,重写其中 onApplicationEvent(E e) 方法即可

11. finishBeanFactory Initialization

* 这一步会将 beanFactory 的成员补充完毕,并初始化所有非延迟单例 bean

* conversionService 也是一套转换机制,作为对 PropertyEditor 的补充

* embeddedValueResolvers 即内嵌值解析器,用来解析 @Value 中的 ${ },借用的是 Environment 的功能

* singletonObjects 即单例池,缓存所有单例对象

* 对象的创建都分三个阶段,每一阶段都有不同的 bean 后处理器参与进来,扩展功能

12. finishRefresh

* 这一步会为 ApplicationContext 添加 lifecycleProcessor 成员,用来控制容器内需要生命周期管理的 bean

* 如果容器中有名称为 lifecycleProcessor 的 bean 就用它,否则创建默认的生命周期管理器

* 准备好生命周期管理器,就可以实现

* 调用 context 的 start,即可触发所有实现 LifeCycle 接口 bean 的 start

* 调用 context 的 stop,即可触发所有实现 LifeCycle 接口 bean 的 stop

* 发布 ContextRefreshed 事件,整个 refresh 执行完成

什么是refresh?Spring refresh 流程相关推荐

  1. Spring refresh流程

    1.refresh源码流程: ①prepareRefresh(): 1)initPropertySources:初始化属性设置,子类自定义实现(模板方法模式) 2)getEnvironment().v ...

  2. spring启动流程(一):启动流程概览

    1. spring 启动流程概览 在前面 demo 的 main()方法中,有这么一行: ApplicationContext context =new AnnotationConfigApplica ...

  3. 简单理解Spring getBean流程

    本文直接讲述流程,不贴代码,全是干货,面试必看,口口相传. 熟悉Spring启动流程的同学应该清楚,refresh()是最为重要的关键方法,其调用的finishBeanFactoryInitializ ...

  4. Spring事务处理流程和原理(动脑学院笔记)

    一.事务理论 1.事务的特性  2.事务的隔离级别 3.事务的传播   4.利用数据库事务实现应用事务控制 要求:同一个事务需要同一个库的同一个连接.  5.单一数据源,如何让事务的所有操作使用同一连 ...

  5. 分布式锁 动态代理 Java数据结构List,Set,Map,Spring执行流程,Spring MVC组件

    这里对今日的内容进行总结: 分布式锁具备的条件: 具备的条件: 在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行. 高可用的获取锁与释放锁. 高性能的获取锁与释放锁. 具备可重入的特 ...

  6. Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程

    Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程 参考文章: (1)Java框架之SpringMVC 05-拦截器-异常映射-Spring工作流程 (2)https:// ...

  7. Spring Batch流程介绍

    Spring Batch流程介绍: 上图描绘了Spring Batch的执行过程.说明如下: 每个Batch都会包含一个Job.Job就像一个容器,这个容器里装了若干Step,Batch中实际干活的也 ...

  8. GDR(Gradual Decoding Refresh, GradualDecoder Refresh)

    GDR(Gradual Decoding Refresh, GradualDecoder Refresh)逐渐刷新,是相对于IDR(Instant Decoder Refresh)的一个概念.为了得到 ...

  9. 初次创建spring boot流程和注意事项

    新手初次创建spring boot流程和注意事项 一.项目整合与部署存在的问题 1.1 SSM手动整合存在的问题 SSM整合步骤多.配置繁琐 项目进行服务器部署步骤繁琐 1.2 如何简化这些繁琐的配置 ...

最新文章

  1. i386平台和x86-64平台机器代码的区别
  2. SAP HR模块的基础数据表和增强配置
  3. 用python做mud
  4. eBay:PayPal今年移动支付总额将超35亿美元
  5. 推荐一个可交互的 Attention 可视化工具!我的Transformer可解释性有救啦?
  6. c++ map 自定义排序_Java学习笔记:Map集合介绍
  7. ini_set ini_get 可操作配置参数列表 设置默认编码等
  8. 从标准到开发,解读基于MOF的应用模型管理
  9. linux基础命令怎么记,linux基础命令--笔记(示例代码)
  10. Windows系统历史版本简介
  11. 数据血缘关系图 工具_QCSPCChart SPC控制图工具,QCSPCChart SPC精湛而轻松
  12. 计算机程序员 面试题库,计算机软考程序员面试题精选题2
  13. linux百度文字识别,基于Linux平台的图片文字识别系统
  14. 网友自制的谷歌输入法皮肤及制作方法
  15. 在校园网的环境下用树莓派搭建私人云
  16. Web网站模板-餐厅饭店宣传响应式网站模板(HTML+CSS+JavaScript)
  17. 高效开发工具使用技巧
  18. java response excel_java-返回在servlet中创建的excel文件作为响应
  19. JavaScript实现蜘蛛纸牌
  20. 移动硬盘安装ubuntu-16.04,疯狂踩坑、分析及解决方法

热门文章

  1. 关于CPU体系结构的123
  2. 使用旅游电商系统对旅行社的四大好处
  3. kafka消息消费有延迟_如何在MQ中实现支持任意延迟的消息?
  4. TP6订单待支付超时自动取消
  5. 讨论《神游》和《人欲》爱情观的前提---各修真派系之爱
  6. AETA地震预测AI算法大赛训练集可视化
  7. 研发组长工作心得总结
  8. HTML显示相机图像
  9. C语言浮点数的发送和接收
  10. 身为女性,在谷歌工作是一种怎样的体验?