Spring中的refresh方法分析

 更新时间:2022年08月17日 15:09:09   作者:​ 斜月   ​  
这篇文章主要介绍了Spring中的refresh方法分析,文章围绕主题展开详细的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 方法的资料请关注脚本之家其它相关文章!

相关文章

  • 解决Mybatis plus实体类属性与表字段不一致的问题

    解决Mybatis plus实体类属性与表字段不一致的问题

    这篇文章主要介绍了Mybatis plus实体类属性与表字段不一致解决方法,文末给大家提到了Mybatis-plus中数据库表名和表字段名的相关知识,需要的朋友可以参考下
    2022-07-07
  • java实现音乐播放器完整代码(调整显示音量大小、调整进度、图片切换)

    java实现音乐播放器完整代码(调整显示音量大小、调整进度、图片切换)

    这篇文章主要给大家介绍了关于java实现音乐播放器(调整显示音量大小、调整进度、图片切换)的相关资料,这本身是老师布置的一个作业,写完感觉不错分享给大家,需要的朋友可以参考下
    2023-07-07
  • java中Supplier知识点总结

    java中Supplier知识点总结

    在本篇文章里小编给大家整理的是一篇关于java中Supplier知识点总结内容,有兴趣的朋友们可以学习下。
    2021-04-04
  • 策略模式:告别if else

    策略模式:告别if else

    你是不是还在写着大量的if else语句,if else 不仅难以维护不易扩展,而且使代码臃肿不堪,想不想让你的业务代码更加的健壮,更易扩展,那你一定要学一学今天的主角策略模式
    2021-06-06
  • 详解Elasticsearch如何把一个索引变为只读

    详解Elasticsearch如何把一个索引变为只读

    这篇文章主要为大家介绍了详解Elasticsearch如何把一个索引变为只读示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java行为型模式中命令模式分析

    Java行为型模式中命令模式分析

    在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时可以使用命令模式来进行设计
    2023-02-02
  • Java 数据结构与算法系列精讲之字符串暴力匹配

    Java 数据结构与算法系列精讲之字符串暴力匹配

    字符串暴力匹配算法是指在一个长字符串中暴力寻找是否包含某一子串所谓暴力匹配,就是不使用任何其他算法,将两个字符串中的字符一一进行比对
    2022-02-02
  • Java switch 语句如何使用 String 参数

    Java switch 语句如何使用 String 参数

    这篇文章主要介绍了Java switch 语句如何使用 String 参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • SpringBoot如何实现Tomcat自动配置

    SpringBoot如何实现Tomcat自动配置

    这篇文章主要介绍了SpringBoot如何实现Tomcat自动配置,帮助大家更好的理解和学习使用SpringBoot框架,感兴趣的朋友可以了解下
    2021-03-03
  • Spring Boot中@Import三种使用方式实例详解

    Spring Boot中@Import三种使用方式实例详解

    这篇文章主要介绍了Spring Boot中@Import三种使用方式,主要有引入普通类,引入importSelector的实现类及引入importBeanDefinitionRegister的实现类,结合实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论