refresh是什么?Spring refresh的12个步骤

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 文件的键值

refresh是什么?Spring refresh的12个步骤

2. obtainFreshBeanFactory

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

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

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

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

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

refresh是什么?Spring refresh的12个步骤

3. prepareBeanFactory

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

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

* propertyEditorRegistrars 会注册类型转换器

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

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

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

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

* ApplicationContextAwareProcessor 用来解析 Aware 接口

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

refresh是什么?Spring refresh的12个步骤

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

refresh是什么?Spring refresh的12个步骤

6. registerBeanPost Processors

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

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

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

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

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

refresh是什么?Spring refresh的12个步骤

7. initMessageSource

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

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

refresh是什么?Spring refresh的12个步骤

8. initApplication ContextEventMulticaster

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

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

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

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

refresh是什么?Spring refresh的12个步骤

9. onRefresh

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

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

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

10. registerListeners

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

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

* 事先编程添加的

* 来自容器中的 bean

* 来自于 @EventListener 的解析

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

refresh是什么?Spring refresh的12个步骤

11. finishBeanFactory Initialization

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

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

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

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

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

refresh是什么?Spring refresh的12个步骤

12. finishRefresh

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

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

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

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

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

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

refresh是什么?Spring refresh的12个步骤

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/262953.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年5月13日 12:47
下一篇 2023年5月13日 12:47

相关推荐

  • 小编分享网站地图在seo优化中起到了怎样的作用。

    网站地图,也称为站点地图,是站点上的单个页面,带有指向站点其他页面的链接。如果找不到网站上所需的信息,则可以通过与站点地图不同的方式找到它。站点地图有什么作用?以下seo优化器将使所有人看到它。首先,为S…

    2023年6月24日
    00
  • 分享网站添加友情链接有哪些方法。

    以下分享的这些方法不能说非常有效,马上上友链30-50个那是不可能的了,有一种也可能,那就是购买,你只要有足够的网站优化预算。没有什么 不可能。抛开这些,说说实打实的一下技巧。 第一种就是,很常见的,但是很…

    2023年6月20日
    01
  • 我来教你关键词在SEO优化中起到什么作用。

    现在的关键词优化行业越来越成熟,很多公司都开始纷纷使用这一类的业务,甚至已经成为了十分成熟的产业,对于一些还没有接触这一类业务的人来说,并不知道关键词优化有什么作用。但为什么企业都要做呢,这显然也是…

    2023年6月23日
    01
  • 分享 六种最有效网络推广方式。

    六种最有效网络推广方式! 网络推广方法,我们先拆解下,两个关键词:网络、推广方法,做网络推广的目的就是通过网络渠道来发展客户,增加企业业绩。现在传统的推广方法,效果越来越不好,并且成本越来越高,都希望…

    2022年10月31日
    028
  • 我来分享回帖的六大作用。

    一、对于大部分卖家来说,最重要的莫过于其宣传功效了。好的回帖配合好的会员名、好的头像和好的签名档,发表在好的帖子的好位置上,能取得非常好的宣传效果(甚至有时候其效果比某些主题帖还好)。好的回帖主要是…

    2023年10月29日
    00
  • 小编分享杭州seo优化的方法有哪些。

    大家最近都有发现百度大更新了吧,是不是很多人的网站又被干掉了呢,那我们如何做好网站策划?又应该如何策划好网站?杭州seo优化的方法有哪些? 我们先来看看现在大家在网站策划方面存在哪些问题吧,如:非常大的轮展…

    2023年6月28日 运营推广
    00
  • 分享饿了么怎么打赏骑手-饿了么打赏骑手的方法。

    饿了么是中国大型的在线外卖订餐平台之一,用户可以通过它来订购食物并享受送餐上门的服务,为了鼓励和表彰骑手的优秀服务,饿了么提供了给骑手打赏的功能,以下是使用饿了么打赏骑手的具体方法: (图片来源网络,…

    2024年6月25日
    014
  • 教你网站建设中适用的几种推广方法。

    网站建设中适用的几种推广方法 在网站建设的过程中,我们常常会运用到一些方法来对网站进行推广,有些方法效果很好,有些可能效果不明显。今天,小编就和大家分享几种比较有效的推广方法。 吸引 网站建设不够精彩,…

    2022年11月10日
    00

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息