广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈Springrefresh的工作流程
  • 859
分享到

浅谈Springrefresh的工作流程

Springrefreshrefresh工作流程 2023-05-17 20:05:25 859人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录功能分类具体步骤1. prepareRefresh2. obtainFreshBeanFactory3. prepareBeanFactory4. postProcessBean

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 执行完成

到此这篇关于浅谈spring refresh的工作流程的文章就介绍到这了,更多相关Spring refresh流程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 浅谈Springrefresh的工作流程

本文链接: https://www.lsjlt.com/news/211492.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Springrefresh的工作流程
    目录功能分类具体步骤1. prepareRefresh2. obtainFreshBeanFactory3. prepareBeanFactory4. postProcessBean...
    99+
    2023-05-17
    Spring refresh refresh工作流程
  • 浅谈Shell 流程控制
    和java、php等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); } else { /...
    99+
    2022-06-04
    shell 流程控制
  • 浅谈Spring Session工作原理
    目录1、引入背景2、使用方法3、工作流程4、缓存机制5、事件订阅6、总结1、引入背景 HTTP协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请...
    99+
    2022-11-12
  • 浅谈Mybatis SqlSession执行流程
    目录Mybatis执行SQL流程 SqlSessionExecutorMybatis之Executor Mybatis之StatementHandler 进入ResultSetHan...
    99+
    2022-11-12
  • 浅谈Android中AsyncTask的工作原理
    目录概述AsyncTask使用方法AsyncTask的4个核心方法AsyncTask的工作原理概述 实际上,AsyncTask内部是封装了Thread和Handler。虽然Async...
    99+
    2022-11-12
  • 浅谈React中的浅比较是如何工作的
    React 中浅比较的概念无处不在,它在不同的流程中起着关键的作用,也可以在React组件的多个生命周期中找到。比如,React Hooks中的依赖数组,通过React.memo进行...
    99+
    2022-11-13
  • 浅谈Vue3中key的作用和工作原理
    这个key属性有什么作用呢?我们先来看一下官方的解释: kekey属性主要用在Vue的虚拟DOM diff算法中,在新旧nodes对比时辨识Vnodes; 如果不使...
    99+
    2022-11-12
  • 浅谈Android IPC机制之Binder的工作机制
    目录进程和线程的关系跨进程的种类Serializable,Parcelable接口Binder进程和线程的关系 按照操作系统中的描述,线程是CPU调度的最小单位,同时线程也是一种有限...
    99+
    2022-11-12
  • 浅谈软件工程师的自我修养
    目录概述角色重构质量小结概述 “对于知识,要求知若渴;对于自己,要虚怀若谷。”优秀的软件工程师一定是在软件开发的道路上前行者。自学是其成长的一个重要手段,在自学的过程中,我们是可以通...
    99+
    2022-11-12
  • 浅谈React-routerv6实现登录验证流程
    目录封装 Context 包裹容器封装 Layout 父级容器开发 Login 模块开发 Protected 包裹容器App 入口文件此示例演示了一个包含三个页面的简单登录流程:公共...
    99+
    2022-11-13
  • 浅谈springBean的作用域
    目录bean的作用域具体实现代码分析前言:最近在进行springBean的作用域学习,并且学习了对应的例子。这里进行一下总结 一:Bean的作用域基础概念 如果想学习SpringBe...
    99+
    2023-02-05
    springBean 作用域
  • 浅谈C++流库的基本结构
    目录一、流库的基本结构二、流库常用API流库是C++标准库的一部分,它提供了一组与输入和输出流相关的类和函数,使得数据的读写变得非常方便和灵活。下面我们将介绍C++流库的基本结构及其...
    99+
    2023-05-16
    C++流库 C++流库基本结构
  • 浅谈ASP.NET Core 中jwt授权认证的流程原理
    1,快速实现授权验证 什么是 JWT ?为什么要用 JWT ?JWT 的组成? 这些百度可以直接找到,这里不再赘述。 实际上,只需要知道 JWT 认证模式是使用一段 Token...
    99+
    2022-06-07
    ASP.NET net jwt core ASP
  • 浅谈Python的元编程
    目录一、装饰器二、装饰器的执行顺序三、元类四、descriptor 类(描述符类)五、总结 相应的元编程就是描述代码本身的代码,元编程就是关于创建操作源代码(比如修改、生成或包装原来...
    99+
    2022-11-12
  • 浅谈化工行业的地磅管理
    一. 化工企业的地磅管理需求 化工行业大宗原材料和燃料的管理需求非常高,以一个中大型的化工企业为例。 年产值 100亿 以大宗原材料和燃料形态存在的价值 60-70亿 每日资金周转额度 1500万 每分钟资金周转额度 10000 ...
    99+
    2023-06-05
  • 浅谈shell脚本中的控制流结构
    习惯了c/c++的编程环境,再转到shell编程上,总有那么一点陌生的感觉。 shell中一般的if-then-else函数格式无外乎如下: if 条件1 then 命令1 elif 条件2 then命令2 ...
    99+
    2022-06-04
    shell脚本控制流结构 浅谈shell脚本中的控制流结构
  • 浅谈java监听器的作用
    监听器是JAVA Web开发中很重要的内容,其中涉及到的知识,可以参考下面导图:Web监听器1 什么是web监听器?web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,Ht...
    99+
    2023-05-31
    java 监听器
  • 浅谈swoole的作用与原理
    目录PHP 中的 Node ?Swoole 到底是什么?如何让它运行?使用 Docker 运行 SwooleSwoole 可以做什么?基于 Swoole 实现 HTTP 服务HTTP...
    99+
    2022-11-12
  • MapReduce工作流程
    MapReduce工作流程图 流程详解(重点) MapTask 待处理的文本通过submit()方法,获取待处理的数据信息,然后根据InputFormat切片方法机制,生成切片方法文件。把切片方法文件和资源配置文件全部提交在资源路径。提...
    99+
    2014-07-24
    MapReduce工作流程
  • SpringMVC工作流程
    SpringMVC工作流程 一、SpringMVC简介SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC架构模式的思想,将web层进行职责解耦,并管理应用所需对象的生命周期,...
    99+
    2014-08-02
    java教程 SpringMVC 工作流程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作