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 方法的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot集成Jasypt敏感信息加密的操作方法

    SpringBoot集成Jasypt敏感信息加密的操作方法

    这篇文章主要介绍了SpringBoot集成Jasypt加密敏感信息,包括敏感信息加密的作用,项目集成Jasypt方式详解,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • 关于SpringSecurity的基本使用示例

    关于SpringSecurity的基本使用示例

    这篇文章主要介绍了关于SpringSecurity的基本使用示例,SpringSecurity 本质是一个过滤器链SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链,需要的朋友可以参考下
    2023-05-05
  • 一文了解为什么Java中只有值传递

    一文了解为什么Java中只有值传递

    Java 传参是值传递还是引用传递?这个问题很基础,但是许多人都有点懵。本文就来通过一些示例带大家详细了解一下,需要的可以参考一下
    2022-07-07
  • 详解Spring Boot 异步执行方法

    详解Spring Boot 异步执行方法

    这篇文章主要介绍了Spring Boot 异步执行方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • 详解Spring Boot最核心的27个注解,你了解多少?

    详解Spring Boot最核心的27个注解,你了解多少?

    这篇文章主要介绍了详解Spring Boot最核心的27个注解,你了解多少?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • springboot中json对象中对Long类型和String类型相互转换

    springboot中json对象中对Long类型和String类型相互转换

    与前端联调接口时,后端一些字段设计为Long类型,这样就有可能导致前端缺失精度,这时候我们就需要将Long类型返回给前端时做数据类型转换,本文主要介绍了springboot中json对象中对Long类型和String类型相互转换,感兴趣的可以了解一下
    2023-11-11
  • Java批量操作文件系统的实现示例

    Java批量操作文件系统的实现示例

    文件上传和下载是java web中常见的操作,本文主要介绍了Java批量操作文件系统的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • java遍历HashMap简单的方法

    java遍历HashMap简单的方法

    这篇文章主要介绍了java遍历HashMap简单的方法,以实例形式简单分析了采用java遍历HashMap的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Spring Boot集成Ehcache缓存解决方式

    Spring Boot集成Ehcache缓存解决方式

    在本篇文章里小编给大家整理的是关于Spring Boot集成Ehcache缓存解决方式,需要的朋友们可以学习下。
    2019-12-12
  • Java 实现栈的三种方式

    Java 实现栈的三种方式

    这篇文章主要介绍了栈:LIFO(后进先出),自己实现一个栈,要求这个栈具有push()、pop()(返回栈顶元素并出栈)、peek() (返回栈顶元素不出栈)、isEmpty()这些基本的方法,需要的朋友可以参考下
    2020-12-12

最新评论