返回顶部
首页 > 资讯 > 前端开发 > VUE >SpringBoot中Spring应用上下文的准备有哪些
  • 834
分享到

SpringBoot中Spring应用上下文的准备有哪些

2024-04-02 19:04:59 834人浏览 泡泡鱼
摘要

SpringBoot中spring应用上下文的准备有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Spring应用上下文的准备首先,通

SpringBootspring应用上下文的准备有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Spring应用上下文的准备

首先,通过图 4-4 来整体了解一下 prepareContext 的核心功能及流程。

SpringBoot中Spring应用上下文的准备有哪些

配合流程图,看一下 SpringApplication 中 prepareContext 方法源代码及功能注解。

private void prepareContext(ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunL isteners listeners , Applicat ionArguments applicat ionArguments, Bann er printedBanner) { //没置上下文的配置环境 context . setEnvironment (environment); //应用上下文后置处理 postProcessApplicationContext( context);//在 context 刷新之前,Appl icat ionContext Init ial izer 初始化 context applyInitializers(context); //通知监听器 context 准备完成,该方法以 上为上下文准备阶段,以下为上下文加载阶段 listeners . contextPrepared(context);//打印日志,启动 Profile if (this . logStartupInfo)- logStartupInfo(context . getParent() == nu1l); logStartupProfileInfo( context); } //获得 ConfigurableL istableBeanFactory 并炷册单例对象 ConfigurableL istableBeanFactory beanFactory = context . getBeanFactory(); beanFactory. reGISterSingleton("springApplicat ionArguments", applicationAr guments); if (printedBanner != null) { //注册打印日志对象 beanF actory. registerSingleton("springBootBanner", printedBanner); if (beanFactory instanceof DefaultlistableBeanFactory) { //没置是否允许覆盖炷册 ((DefaultListableBeanFactory) beanFactory) . setAllowBeanDefinitionOverriding(this . allowBeanDefinitionOverriding); //获取全部配置源,其中包含 primarySources 和 sources Set<0bject> sources = getAllSources(); Assert . notEmpty(sources, "Sources must not be empty"); //将 sources 中的 Bean 加载到 context 中 load(context, sources . toArray(new 0bject[0])); //遁知监听器 context 加载完成 listeners . contextLoaded(context); }

通过流程图和具体代码可以看出,在该方法内完成了两步操作:应用上下文的准备和加载。

下面我们针对具体的源代码进行详细讲解。

应用上下文准备阶段

在上下文准备阶段,主要有 3 步操作:对 context 设 置 environment、应用上下文后置处理和  ApplicationContextlnitializer 初始化 context 操作。

首先是对 context 设置 environment,代码和业务操作都很简单。

public void setEnvironment (ConfigurableEnvironment environment) { //设置 context 的 environment super. setEnvi ronment( environment); //设置 context 的 reader 属性的 conditionEvaluator 属性 this.reade er. settEnvironment(environment) ; //设置 context 的 scanner 属性的 environment 属性 this. scanner. setEnvi ronment ( envi ronment); }

随 后 , 便 是 进 行 Spring 应 用 上 下 文 的 后置处理 , 这 一 步 是 通  过postProcessApplicationContext 方法来完成的。

protected void postProcessApplicat ionContext (ConfigurableApplicat ionConEext context){ f (this. beanNameGenerator != null) { // 如果 beanNameGenerator 为 null, 则将当前的 beanNameGenerator 按照默认名字进 行注册 context . getBeanFactory(). regi sterSingleton( Annotat ionConfigUtils .CONF IGURATION BEAN NAME GENERATOR, this . beanNameGenerator); esourceLoader 为 null 时, 则根据 context 的类型分别进行 Resourceloader 和 CL assLoader 的设置 if (this .resourceLoader != null) { F (context instanceof GenericApplicationContext) { ((GenericApplicationContext) context) . setResourcel oader(this . resource Loader); if (context instanceof DefaultResourceLoader) { ( (DefaultResourceLoader) context) . setClassLoader(this.resourceLoader. getClassLoader()); //如果为 true 则获取并没置转换服务 f (this .addConversionService) { context . getBeanFactory(). setConversionService( ApplicationConversionService . getSharedInstance()); }

postProcessApplicationContext 方 法 主 要 完 成 上 下 文 的 后 置 操 作 , 默 认 包  含beanNameGeneratorResourceL oader.ClassL oader 和 ConversionService  的设置。该方法可由子类覆盖实现,以添加更多的操作。

而在此阶段,beanNameGenerator 和 resourceL oader 都为 null,因此只操作了最后-一步的设置转换服务。

最后,在通知监听器 context 准备完成之前,通过 applylnitializers 方法对上下文进行初始化。

所使用的 ApplicationContextInitializer 正是我们在 SpringApplication 初始化阶段设置在itializers  变量中的值,只不过在通过 getlnitializers 方法获取时进行了去重和排序

protected void applyInitializers(ConfigurableApplicat ionContext context) { /获取 Appl icat ionContextInitializer 集合并遍历 for (ApplicationContextInitializer initializer : getInitializers()) { //解析当前 initial izer.实现的 Appl icat ionContextInitializer 的泛型参数 Class<?> requiredType = GenericTypeResolver . resolveTypeArgument( initializer . getClass(), ApplicationContextInitializer.class); 1 断言判断所需类似是否与 context 类型匹配 Assert. isInstanceOf(requiredType, context, "Unable to call initialize r."); // 初始化 context initializer. initialize(context); } }

完成以上操作之后,程序便调用 SpringApplicationRunListeners 的 contextPrepared  方法通知监听器,至此第一阶段的准备操作完成。

应用上下文加载阶段

应用上下文加载阶段包含以下步骤:打印日志和 Profile 的设置、设置是否允许覆盖注册、获取全部配置源、将配置源加载入上下文、通知监控器 contex  加载完成。

首先进入应用上下文加载阶段的操作为打印日志和 Profile 的设置,对此不展开讲解。随后,便是获得 ConfigurableL  istableBeanFactory 并注册单例对象,注册的单例对象包含:

ApplicationArguments 和 Banner。 当 BeanFactory 为 DefaultL istableBeanFactory  时,进入设置是否允许覆盖注册的处理逻辑。

此处需注意的是,当进行了 ApplicationArguments 类单例对象的注册之后,也就意味着我们在使用 Spring  应用上下文的过程中可以通过依赖注入来使用该对象。

@Resource private ApplicationArguments applicat ionArguments;

完成以.上操作后,便进入配置源信息的处理阶段,这一步通过 getAllSources 方法来对配置源信息进行合并操作。

public Set<Object> getAllSources() { Set<0bject> allSources = new LinkedHashSet<>(); if (!CollectionUtils.isEmpty(this . primarySources)) { allSources.addAll(this.primarySources); if (!CollectionUtils . isEmpty(this. sources)) { allSources. addAll(this.sources); } }

return Collections . unmodifiableSet(allSources); }以上操作逻辑很简单,如果 Set  集合中不存在 primarySources 配置源或 sources 配置源,则将其添加入 Set 中,同时将 Set 设置为不可修改,并返回。

前面章节已经提到,变量 primarySources 的值 来自 SpringApplication 的构造参数,变量sources 的值来自  setResources 方法。

当获得所有的配置源信息之后,通过 load 方法将配置源信息加载到上下文中,代码如下。

protected void load(ApplicationContext context, Object[] sources) { /日志打印 BeanDefinitionLoader loader = createBeanDefinitionLoader( getBeanDefinitionRegistry(context), sources); f (this. beanNameGenerator != nu1l). loader. setBeanNameGenerator(this . beanNameGenerator); if (this.resourceLoader != nu1l) { loader . setResourceLoader(this . resourceLoader); if (this. environment != null) { loader . setEnvironment (this . environment) ; loader. load(); }

该方法主要通过 BeanDefinitionL oader  来完成配置资源的加载操作。我们进一步查看方法createBeanDefinitionL oader 的源代码,会发现它最终调用了 BeanDefinitionL  oader 的构造方法,并进行初始化操作。

BeanDefinitionLoader(BeanDefinitionRegistry registry, Object... sources) { this. sources = sources; this . annotatedReader = new AnnotatedBeanDefinitionReader(registry); this . xmlReader = new XmlBeanDefinitionReader(registry); if (isGroovyPresent()) this. groovyReader = new GroovyBeanDefinitionReader(registry); }

通过 BeanDefinitionLoader  的构造方法我们可以看到 BeanDefinitionLoader  支持基于AnnotatedBeanDefinitionReaderXmlBeanDefinitionReader、GroovyBeanDefinitionReader等  多种类型的加载操作。

在执行完 BeanDefinitionL oader 的创建及基本属性设置之后,调用其  load方法,该方法最终执行以下代码。

private int load(0bject source) { Assert. notNull(source, "Source must not be null"); if (source instanceof Class<?>) { return load((Class<?>) source); }if (source instanceof Resource) return load( (Resource) source); } if (source instanceof Package) { return load( (Package) source); } if (source instanceof CharSequence) { return load( (CharSequence) source); throw new IllegalArgumentException("Invalid source type ”+ source. getC lass());}

从以上代码可以看出,BeanDefinitionLoader 加载支持的范围包括:

Class、Resource、 Package 和 CharSequence 四种。 前面我们已经提到变量 sources的来源有  primarySources 配置源和 sources 配置源。变量 primarySources 在初始化时接收的类型为 Class,而变量 sources  通过 set(Set )方法接收的参数为 String 集合。

因此,在实际使用的过程中,Resource 和 Package  的判断分支始终无法进入执行阶段。

完成以上操作后,接下来执行 SpringApplicationRunListeners 的 contextL  oaded 方法通知监听器上下文加载完成,至此整个 Spring 应用上下文的准备阶段完成。

关于SpringBoot中Spring应用上下文的准备有哪些问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网VUE频道了解更多相关知识。

--结束END--

本文标题: SpringBoot中Spring应用上下文的准备有哪些

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

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

猜你喜欢
  • SpringBoot中Spring应用上下文的准备有哪些
    SpringBoot中Spring应用上下文的准备有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Spring应用上下文的准备首先,通...
    99+
    2024-04-02
  • SpringBoot中下载文件的方式有哪些
    这篇文章将为大家详细讲解有关SpringBoot中下载文件的方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文件来源这里还是以GridFS为例,主要演示的还是从mongo下载下来的文件,如果是本地...
    99+
    2023-06-21
  • 详解在SpringBoot应用中获取应用上下文方法
    定义上下文工具类:package com.alimama.config;import org.springframework.context.ApplicationContext;public class SpringContextUtil...
    99+
    2023-05-31
    spring boot 上下文
  • JavaScript函数中上下文有哪些规则
    目录1.规则1:对象.方法()1.1 案例11.2 案例21.3 案例31.4 案例42.规则2:函数()2.1 案例12.2 案例23.规则3:数组下标3.1 案例13.2 案例2...
    99+
    2024-04-02
  • Android应用中实现文件下载的方法有哪些
    本篇文章为大家展示了Android应用中实现文件下载的方法有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、自己封装URLConnection 连接请求类 public void downlo...
    99+
    2023-05-31
    android roi
  • js执行上下文的类型有哪些
    这篇文章主要讲解了“js执行上下文的类型有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“js执行上下文的类型有哪些”吧!全局上下文:是基础,默认上下文类型,任何不在函数内的代码都在全局上...
    99+
    2023-06-25
  • Python 在 Spring 框架中的应用场景有哪些?
    Python 和 Spring 框架都是在软件开发领域非常流行的工具,它们分别在不同的领域发挥着重要的作用。但是,Python 在 Spring 框架中的应用场景又有哪些呢?本文将为您详细介绍。 Spring Boot 中使用 Pytho...
    99+
    2023-09-04
    文件 关键字 spring
  • 【SpringBoot+MyBatisPlus】文件上传与文件下载的应用与实现
    文章目录 前言一.文件上传二.改进三.文件下载四.上传图片/回显图片 前言 一次“上传文件”的点击蕴含着一轮请求,我们要做的就是针对每一次的请求进行i/o处理,并返回给前端用户 一.文...
    99+
    2023-09-08
    spring boot java mybatis
  • ioc在spring中的作用有哪些
    今天就跟大家聊聊有关ioc在spring中的作用有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。IoC——Inversion of Control,控制反转在Java开发中,Io...
    99+
    2023-05-31
    spring ioc
  • SpringBoot中有哪些常用的注解
    这篇文章将为大家详细讲解有关SpringBoot中有哪些常用的注解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。@SpringBootApplication...
    99+
    2024-04-02
  • SpringBoot中常用的注解有哪些
    这篇文章主要介绍了SpringBoot中常用的注解有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、@SpringBootApplication此注解是Spring B...
    99+
    2023-06-21
  • Flask中的请求上下文和应用上下文对象如何理解
    这篇文章将为大家详细讲解有关Flask中的请求上下文和应用上下文对象如何理解,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在Flask中处理请求时,应用会生成一个“请求上下文”对象。整个请求...
    99+
    2023-06-17
  • Go 文件对象在 Windows 平台上有哪些应用?
    在 Go 语言中,文件对象是重要的概念。它是指一个指向文件的指针,可以对文件进行读写操作。在 Windows 平台上,Go 文件对象有很多应用。本文将介绍一些常见的应用场景。 读写文件 读写文件是 Go 文件对象最常见的应用场景之一。...
    99+
    2023-10-29
    文件 windows 对象
  • Linux上的优秀笔记应用有哪些
    本文小编为大家详细介绍“Linux上的优秀笔记应用有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux上的优秀笔记应用有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1. Joplin主要功能:支...
    99+
    2023-06-15
  • spring boot中有哪些常用的注解
    spring boot中有哪些常用的注解?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。@RestController和@RequestMapping注解0重要的一个新的改进...
    99+
    2023-05-31
    springboot 中有 注解
  • Java中文件上传的方式有哪些
    本文小编为大家详细介绍“Java中文件上传的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中文件上传的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。请求类型单文件上传 &n...
    99+
    2023-07-02
  • Springboot中静态文件的引入方式有哪些
    这篇文章给大家分享的是有关Springboot中静态文件的引入方式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。thymeleaf 模式依赖中引入<!-- 渲染静态页面 -->...
    99+
    2023-06-29
  • Android应用中获取设备唯一ID的方法有哪些
    本篇文章为大家展示了Android应用中获取设备唯一ID的方法有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。先来看看几种比较单一的方式:IMEI方式:TelephonyManager.getD...
    99+
    2023-05-31
    android roi
  • springboot配置文件中使用${}注入值的方式有哪些
    这篇文章主要为大家展示了“springboot配置文件中使用${}注入值的方式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“springboot配置文件中使用${}注入值的方式有哪些”这篇...
    99+
    2023-06-29
  • Python数组在Spring框架中的实时应用有哪些优势?
    随着大数据时代的到来,数据处理变得越来越重要。在这种情况下,使用Python数组在Spring框架中进行实时应用已经成为了一种趋势。Python数组是一种非常强大的数据结构,可以在Spring框架中发挥出很多优势,下面我们就来探讨一下Py...
    99+
    2023-07-04
    数组 实时 spring
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作