我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring中的refresh方法分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring中的refresh方法分析

1 前言

在项目开发和面试过程中 spring 都是非常重要的,在前文中已经讲述了Spring BeanFactory 与 FactoryBean 的区别,在后续的文章中将继续更新 Spring 源码心得。了解原理性的一些内容之后就会在应用能够得心应手,在项目开发和面试中,就能很好地 battle 和 show muscle。

2 源码入口哪里找

Spring 的源码阅读,需要找到入口文件,一般情况下在 Spring 项目中,由 tomcat 容器启动后加载项目中设置的 web.xml,在改文件中添加项目的配置文件,监听器等内容,其中 DispatcherServlet 尤为重要,其 onRefresh 方法就是其核心操作。不过随着 springboot 的诞生,配置化的思想成型后,获取源码的入口就相对简单了,核心需要关注 AbstractApplicationContext.refresh

获取方法的入口常见的如下所示:

# 通过配置文件来读取
ClassPathXmlApplicationContext ct = new ClassPathXmlApplicationContext("bean.xml");
# 通过配置类来加载
AnnotationConfigApplicationContext ct = new AnnotationConfigApplicationContext(MainConfig.class);
# 两者都是AbstractApplicationContext 的子类
AbstractApplicationContext

如下图所示,通过配置文件来加载的 ClassPathXmlApplicationContext 是在构造方法中调用了其父类的 refresh 方法,这个方法就是核心,就是大家都知道的 AbstractApplicationContext.refresh() 。

3 refresh 核心方法

关于源码的阅读,因其复杂的文件结构,在梳理其结构时,需要抓大放小,不宜深入细节,否则就容易迷路,不记得来时的路了。下图便是核心方法 AbstractApplicationContext.refresh

对于 refresh 方法主要分为以下核心的 12 个方法:

  • prepareRefresh() 刷新前的预处理,调用 initPropertySources() 方法初始化一些属性设置,调用 getEnvironment().validateRequiredProperties() 校验属性的合法性,设置 earlyApplicationEvents= new LinkedHashSet() 保存容器中较早期的事件。
  • obtainFreshBeanFactory() 获取 BeanFactory,创建一个刷新的 Bean 工厂,refreshBeanFactory() 并设置容器 ID,然后将创建的 DefaultListableBeanFactory 的对象进行返回。
  • prepareBeanFactory(beanFactory) BeanFactory 的预准备工作,设置 BeanFactory 的类加载器和表达式解析器,并添加 BeanPostProcessor【ApplicationContextAwareProcessor】,设置自动装配的接口,添加 BeanPostProcessor。
  • postProcessBeanFactory(beanFactory) BeanFactory 准备工作完成后进行的后置处理工作,子类通过重写这个方法来做进一步的设置。
  • invokeBeanFactoryPostProcessors(beanFactory) 执行 BeanFactoryPostProcessor 和 BeanFactory 方法的后置处理器。在 BeanFactory 标准初始化之后执行 BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor。先执行 BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry 方法,按照 PriorityOrdered 、Ordered 和其它未设置优先级来执行,然后按照同样的优先级来执行 BeanFactoryPostProcessor.postProcessBeanFactory 方法。
  • registerBeanPostProcessors(beanFactory) 注册 BeanPostProcessor(Bean 的后置处理器),不同接口类型的 BeanPostProcessor 在 Bean 创建前后的执行时机是不一样的。
  • initMessageSource() 初始化 MessageSource 组件, 做国际化功能、消息绑定、消息解析等。
  • initApplicationEventMulticaster() 初始化事件派发器,如果容器中没有事件派发器,那么就创建一个 SimpleApplicationEventMulticaster 并添加到容器中。
  • onRefresh() 留给子容器(子类),例如在 springboot 中,用来创建 tomcat、jetty 容器并启动。
  • 10 registerListeners() 给容器中将所有项目里面的 ApplicationListener 注册进来,并将监听器注册到事件派发器中。
  • 11 finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的单实例 bean,这个方法是核心方法,在后续的主要流程中会详细讲解。
  • 12 finishRefresh()完成 BeanFactory 的初始化创建工作,IOC 容器就创建完成。

4 总结

在本文中,讲述了 Spring 容器启动的核心方法 refresh, 介绍了主要的启动流程方法

以上就是Spring中的refresh方法分析的详细内容,更多关于spring refresh 方法的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring中的refresh方法分析

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

下载Word文档

猜你喜欢

Spring refresh()源码分析

今天小编给大家分享一下Spring refresh()源码分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。正文public
2023-07-05

Spring中的refresh方法怎么用

这篇文章主要介绍“Spring中的refresh方法怎么用”,在日常操作中,相信很多人在Spring中的refresh方法怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring中的refresh方法
2023-06-30

Spring中refresh()方法有什么用

这篇文章将为大家详细讲解有关Spring中refresh()方法有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题
2023-05-30

EasyUI 的Window窗口refresh方法

EasyUI中的Window窗口组件没有提供refresh方法。如果需要刷新Window窗口内容,可以使用以下两种方法:1. 使用load方法重新加载窗口内容:可以在窗口初始化时使用load方法加载内容,并在需要刷新时再次调用load方法重
2023-09-08

Spring容器初始化register与refresh方法是什么

这篇文章主要讲解了“Spring容器初始化register与refresh方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring容器初始化register与refresh方法是
2023-07-02

@ComponentScan在spring中无效的原因分析以及解决方法

这篇文章将为大家详细讲解有关@ComponentScan在spring中无效的原因分析以及解决方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。@ComponentScan在spring中无
2023-06-25

Java中的SimpleDateFormat方法分析

Java中的SimpleDateFormat方法分析 先进行专栏介绍SimpleDateFormat方法分析 常用方法构造方法格式化(从Date到String)举例分析 解析(从String到Date)举例分析
2023-08-16

Spring源码解析之推断构造方法的示例分析

小编给大家分享一下Spring源码解析之推断构造方法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring推断构造方法贴个测试代码直接开干,这只是个
2023-06-15

Java中Spring Boot的示例分析

这篇文章主要介绍Java中Spring Boot的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 什么是 Spring Boot?Spring Boot 是为 Spring 服务的,是用来简化新 Spri
2023-06-20

Java中方法的示例分析

这篇文章给大家分享的是有关Java中方法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是方法例如:System.out.println();其结构为-->类.对象.方法;其含义为-->调用系统类Sy
2023-06-20

spring Kafka中的@KafkaListener源码分析

本篇内容主要讲解“spring Kafka中的@KafkaListener源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spring Kafka中的@KafkaListener源码分析”
2023-07-05

Spring Boot配置方式的示例分析

这篇文章给大家分享的是有关Spring Boot配置方式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配
2023-05-30

Spring的示例分析

这篇文章将为大家详细讲解有关Spring的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。WHY在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于E
2023-05-30

spring中IoC和DI的示例分析

这篇文章主要介绍spring中IoC和DI的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!这里先来简单介绍下IoC和DI的区别:IOC:翻译过来是控制反转,将对象的创建权由Spring管理,HelloServ
2023-05-30

Spring中IOC和AOP的示例分析

小编给大家分享一下Spring中IOC和AOP的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Spring是一个开源框架,主要实现两件事,IOC(控制反转
2023-05-30

PHP中mysqli_affected_rows()方法的示例分析

这篇文章主要介绍了PHP中mysqli_affected_rows()方法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php有什么特点1、执行速度快。2、具有很好
2023-06-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录