当前位置:首页 > 话题广场 > 攻略专题 > 游戏问答

关于如何初始化接口,你需要知道这些Spring容器是怎么初始化的

弹簧容器是如何初始化的?

原创宣言

本人不支持签署原创文章未经许可转载。

本公众号所有文章均原创,为了容易理解和记忆,文章以图解为主、代码为辅。如果您感兴趣,欢迎关注!

文/吴潇(Java Senior)

本文分析Spring容器初始化过程。在Spring Framework中,所有类型的容器都是由ApplicationContext接口表示的,而AbstractApplicationContext是这个接口的第一个实现,包含适用于各类容器的公共代码。所以我们分析容器初始化过程,主要是分析AbstractApplicationContext中跟初始化相关的代码。

类结构

如果从Web应用中常用的XmlWebApplicationContext容器开始,不断查找父类,可以得知Spring容器的主体代码在AbstractApplicationContext这个类中。Spring容器类的继承关系如下图所示。

AbstractApplicationContext的父类DefaultResourceLoader只负责加载资源,AbstractApplicationContext在内部维护一个BeanFactory(负责管理bean definition,今后将单独撰文分析),并且管理由这个BeanFactory创建的bean,并且AbstractApplicationContext还负责检测在BeanFactory中定义的特殊bean,从而实现容器自身功能以及支持扩展。

顺便讲一个用Idea快速看UML类图的技巧

Spring除提供多种类型的容器,还为Bean定义提供xml、注解、Java等多种配置方式,涉及类比较多,我们可能对ApplicationContext、BeanFactory等的关系感到困惑,其实可用一张图概括如下。

上图看不清没关系,用Intellij IDEA打开任何一个使用到Spring的项目,找到XmlWebApplicationContext类,把光标移到类名上,使用以下功能即可立即生成UML。

特殊作用的Bean

接着前面,我们说到AbstractApplicationContext内部包含一个BeanFactory,它负责为容器创建bean;而AbstractApplicationContext负责检测BeanFactory中定义的bean是不是特殊bean,并且使用这些特殊bean完成相关的功能。例如,类型为MessageSource的bean负责为Spring翻译文本(名称必须为messageSource),类型为ApplicationEventMulticaster的bean负责为Spring容器发送事件(名称必须定义为applicationEventMulticaster)。

比较常用的特殊bean包括BeanFactoryPostProcessor和BeanPostProcessor,其中,BeanFactoryPostProcessor负责对容器整体进行一些修改或功能扩展,而BeanPostProcessor则负责对每一个普通的bean进行一个修改或扩展。用户只要把实现了这两个接口的bean部署在容器中,就可以对Spring容器进行扩展了。

初始化过程(refresh)

AbstractApplicationContext的初始化过程就体现在refresh方法中。

1)首先,把容器定义中的占位符变量(以$符号开头的属性变量)替换为真正的值(AbstractApplicationContext只定义了一个算法框架,具体实现在子类中),然后检查必须解析的占位符变量替换成功没有,如果有$变量未解析,则抛出MissingRequiredPropertiesException,停止初始化。

2)然后,刷新内部的bean factory(即调用refreshBeanFactory),并且返回刷新后的bean factory。这一步操作所做的主要工作,用通俗的语言来描述就是,让bean factory重新加载bean definition配置。

3)得到bean factory之后,对这个bean factory进行一系列配置,例如设置bean class loader等,把bean factory所依赖的组件传给bean factory,例如BeanExpressionResolver和PropertyEditorRegistrar。同时,在bean factory标记一些特殊的类,让他们不参与到autowiring,注册一些特殊的singleton对象到bean factory。

4)在bean definition加载完成后(实例化所有bean之前),配置BeanPostProcessors,把它们注册到bean factory中。

5)调用BeanFactoryPostProcessor,对容器进行一些处理。

6)实例化并调用BeanPostProcessor。

7)创建MessageSource。

8)创建ApplicationEventMulticaster。

9)创建其他特殊bean。

10)注册事件监听器。

11)实例化所有非lazy-init的singleton bean。

12)清理掉容器中的资源缓存等。

13)创建LifecycleProcessor类型的特殊bean,再去调用这个bean的onRefresh方法,去执行其他与refresh相关的工作。

14)在容器中发布ContextRefreshedEvent事件,代表容器已刷新(初始化)完成。

以上就是AbstractApplicationContext中refresh的执行动作。

以上我们分析了Spring容器的初始化过程,希望对您的工作和面试都有帮助。如果对互联网编程技术、Java、Spring、Android、C/C++、Linux、个性化推荐、Community Detection、Machine Learning、Deep Learning、Data Mining、Gnuplot、LaTeX等技术感兴趣的话,欢迎关注本公众号(不限于Java)。

1.《关于如何初始化接口,你需要知道这些Spring容器是怎么初始化的》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《关于如何初始化接口,你需要知道这些Spring容器是怎么初始化的》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/gl/2105272.html

上一篇

.net如何连接mysql数据库?终于找到答案了干货!Python与MySQL数据库的交互实战

下一篇

.pfx文件如何打开?总结很全面速看!那些证书相关的玩意儿 SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等

如何初始化接口?总结很全面速看!BIOS的初始化和引导加载程序

如何初始化接口?总结很全面速看!BIOS的初始化和引导加载程序

如何初始化接口相关介绍,BIOS是基本输入/输出系统(Basic Input/Output System)的缩写,是硬件和软件之间的接口,是非常基本的接口。 BIOS提供了一组基本的操作系统使用的指令,系统启动的成功与否依赖...

关于如何初始化接口,你需要知道这些MCU性能测试,CoreMark极简入门教程

关于如何初始化接口,你需要知道这些MCU性能测试,CoreMark极简入门教程

如何初始化接口相关介绍,MCU性能测试最著名的部分是CoreMark和Dhrystone。 CoreMark以每秒迭代为性能评估,而Dhrystone的DMIPS与Dhrystone标准有关。 本文讨论CoreMark,先来...

如何初始化接口?终于找到答案了MyBatis初始化加载 Mapper 接口与XML文件

如何初始化接口?终于找到答案了MyBatis初始化加载 Mapper 接口与XML文件

如何初始化接口相关介绍,在MyBatis初始化过程中,大致有以下几个步骤:分解所有IT类编制 创建Configuration全局配置对象时,TypeAliasRegistry别名注册中心将添加Mybatis所需的相关类,并将...

关于如何初始化接口,你需要知道这些无法初始化windows sockets接口

关于如何初始化接口,你需要知道这些无法初始化windows sockets接口

如何初始化接口相关介绍,请试试这个方法。我也有这种情况。现在用这个方法解决了。可能是昨天的自动更新,可能出了问题,可能是单机。但是只要和互联网接触,就不能运行。今天Vista和Win7好像大部分都中奖了。(大卫亚设)。 应该...

如何初始化接口看这里!什么是 COM 接口?

如何初始化接口看这里!什么是 COM 接口?

如何初始化接口相关介绍,如果你懂C#或Java语言,界面将是一个非常熟悉的概念。 接口是一个对象上一组操作的集合,不涉及任何实现的细节,接口标志着方法和实现的分离。计算机中这种现象叫做解耦(decoupled)。 在 C++...

关于如何初始化接口,你需要知道这些Spring Boot如何在启动时初始化资源?实现CommandLineRunner接口

关于如何初始化接口,你需要知道这些Spring Boot如何在启动时初始化资源?实现CommandLineRunner接口

如何初始化接口相关介绍,在实际工作中,项目启动时需要执行初始化任务(如初始化数据库连接、Redis缓存等)的要求。 今天就给大家介绍 CommandLineRunner接口,帮助大家解决项目启动初始化资源操作。 Comman...

关于如何初始化接口,你需要知道这些S7-300集成DP口之间GSD文件方式的DP主从通信(Step7)

关于如何初始化接口,你需要知道这些S7-300集成DP口之间GSD文件方式的DP主从通信(Step7)

如何初始化接口相关介绍,S7-300集成DP端口之间的GSD文件驱动DP主从通信(Step7) PROFIBUS-DP是一种通信标准,一些符合PROFIBUS-DP约定的第三方设备也可以作为SIMATIC master的从属...

如何初始化接口看这里!电脑提示windows通信端口初始化失败的解决方法

如何初始化接口看这里!电脑提示windows通信端口初始化失败的解决方法

如何初始化接口相关介绍,出现Windows系统通信端口初始化失败的消息怎么办?最近,很多用户询问了windows系统通信端口初始化失败的解决方法,我将分享如下。(大卫亚设)。 解决方法: 1、我们把电脑中的360安全卫士退出...