皇冠体育 首页 皇冠赌球 皇冠投注网 皇冠开户 皇冠足球 皇冠官方 皇冠博彩 皇冠官网 皇冠新网址 皇冠直播

你的位置: 皇冠体育 > 皇冠新网址 >

6868轮盘博彩平台攻略_18张图,详解 SpringBoot 剖析 Yml 全经过

发布日期:2023-10-30 04:41    点击次数:68

6868轮盘博彩平台攻略_18张图,详解 SpringBoot 剖析 Yml 全经过

6868轮盘博彩平台攻略_ 布景

前几天的技艺重庆时时彩炸金花,技俩里有一个需求,需要一个开关边界代码中是否践诺一段逻辑,于是理所虽然的在yml文献中竖立了一个属性行为开关,再合作nacos就不错随时改造这个值达到咱们的打算,yml文献中是这么写的:

switch: 重庆时时彩炸金花  turnOn: on 

规范中的代码也很简易,大约的逻辑即是底下这么,要是取到的开关字段是on的话,那么就践诺if判断中的代码,不然就不践诺:

@Value("${switch.turnOn}") private String on;  @GetMapping("testn") public void test(){     if ("on".equals(on)){         //TODO     } } 

然则现代码本色跑起来,有风趣的地点来了,咱们发现判断中的代码一直不会被践诺,直到debug一下,才发现这里的取到的值确切不是on而是true。

看到这,是不是嗅觉有点风趣,最初盲猜是在剖析yml的过程中把on行为一个寥落的值进行了处罚,于是我干脆再多测试了几个例子,把yml中的属性扩张到底下这些:

switch:   turnOn: on   turnOff: off   turnOn2: 'on'   turnOff2: 'off' 

再践诺一下代码,看一下映射后的值:

6868轮盘

2020年3月非法出境缅甸。2021年9月24日自缅甸经边境投案自首,实行隔离医学观察。9月26日新冠病毒核酸检测阳性,转运至瑞丽市方舱医院隔离诊治,诊断新冠肺炎确诊病例(轻型,缅甸输入)。

不错看到,yml中莫得带引号的on和off被更始成了true和false,带引号的则保抓了原本的值不发生改造。

到这里,让我忍不住有点好奇,为什么会发生这种情景呢?于是强忍着困意翻了翻源码,硬磕了一下SpringBoot加载yml竖立文献的过程,终于让我看出了点门谈,底下咱们少许少许细说!

因为竖立文献的加载会触及到一些SpringBoot启动的关连学问,是以要是对这一块不是很熟习的同学,不错先提前先看一下Hydra在古早时代写过一篇著作预热一下。底下的先容中,只会摘出一些对加载息争析竖立文献比拟紧要的设施进行分析,对其他无关部分进行了不祥。

加载监听器

当咱们启动一个SpringBoot规范,在践诺SpringApplication.run()的技艺,最初在脱手化SpringApplication的过程中,加载了11个终昭着ApplicationListener接口的阻难器。

皇冠客服飞机:@seo3687

这11个自动加载的ApplicationListener,是在spring.factories中界说并通过SPI扩张被加载的:

这里列出的10个是在spring-boot中加载的,还有剩余的1个是在spring-boot-autoconfigure中加载的。其中最要道的即是ConfigFileApplicationListener,它和背面要讲到的竖立文献的加载关连。

践诺run活动

在实例化完成SpringApplication后,会接着往下践诺它的run活动。

不错看到,这里通过getRunListeners活动获取的SpringApplicationRunListeners中,EventPublishingRunListener绑定了咱们前边加载的11个监听器。然则在践诺starting活动时,阐述类型进行了过滤,最终本色只践诺了4个监听器的onApplicationEvent活动,并莫得咱们但愿看到的ConfigFileApplicationListener,让咱们接着往下看。

当run活动践诺到prepareEnvironment时,会创建一个ApplicationEnvironmentPreparedEvent类型的事件,并播送出去。这时总共的监听器中,有7个会监听到这个事件,之后会差别调用它们的onApplicationEvent活动,其中就有了咱们记起心骨的ConfigFileApplicationListener,接下来让咱们望望它的onApplicationEvent活动中作念了什么。

游戏

在活动的调用过程中,会加载系统我方的4个后置处罚器以及ConfigFileApplicationListener自己,一共5个后置处罚器,并践诺他们的postProcessEnvironment活动,其他4个对咱们不紧要不错略过,最终比拟要道的设施是创建Loader实例并调用它的load活动。

加载竖立文献

这里的Loader是ConfigFileApplicationListener的一个里面类,看一下Loader对象实例化的过程:

在实例化Loader对象的过程中,再次通过SPI扩张的表情加载了两个属性文献加载器,其中的YamlPropertySourceLoader就和背面的yml文献的加载、剖析密切关联,而另一个PropertiesPropertySourceLoader则负责properties文献的加载。创建完Loader实例后,接下来会调用它的load活动。

在load活动中,和会过嵌套轮回表情遍历默许竖立文献存放旅途,再加上默许的竖立文献称呼、以及不同竖立文献加载器对应剖析的后缀名,最终找到咱们的yml竖立文献。接下来,脱手践诺loadForFileExtension活动。

zh皇冠信用登录网址

在loadForFileExtension活动中,最初将classpath:/application.yml加载为Resource文献,接下来准备负责脱手,调用了之前创建好的YamlPropertySourceLoader对象的load活动。

封装Node

在load活动中,脱手准备进行竖立文献的剖析与数据封装:

load活动中调用了OriginTrackedYmlLoader对象的load活动,从字面风趣上咱们也不错承接,它的用途是原始跟踪yml的加载器。中间一连串的活动调用不错忽略,径直看终末亦然最紧要的是一步,调用OriginTrackingConstructor对象的getData接口,来剖析yml并封装成对象。

皇冠信誉网

在剖析yml的过程中本色使用了Composer构建器来生成节点,在它的getNode活动中,通过剖析器事件来创建节点。频繁来说,它会将yml中的一组数据封装成一个MappingNode节点,它的里面本色上是一个NodeTuple组成的List,NodeTuple和Map的结构访佛,皇冠官方由一双对应的keyNode和valueNode组成,结构如下:

好了,让咱们再回到上头的那张活动调用经过图,它是阐述著作开始的yml文献中本色内容内容绘画的,要是内容不同调用经过会发生改造,群众只需要明白这个旨趣,底下咱们具体分析。

最初,创建一个MappingNode节点,并将switch封装成keyNode,然后再创建一个MappingNode,行为外层MappingNode的valueNode,同期存储它底下的4组属性,这亦然为什么上头会出现4次轮回的原因。要是有点困惑也不紧要,看一下底下的这张图,就能一目了然了解它的结构。

在上图中,又引入了一种新的ScalarNode节点,它的用途也比拟简易,简易String类型的字符串用它来封装成节点就不错了。到这里,yml中的数据被剖析完成并完成了初步的封装,可能眼尖的小伙伴要问了,上头这张图中为什么在ScalarNode中,除了value还有一个tag属性,这个属性是干什么的呢?

在先容它的作用前,先说一下它是怎样被详情的。这一块的逻辑比拟复杂,群众不错翻一下ScannerImpl类fetchMoreTokens活动的源码,这个活动会阐述yml中每一个key或value是以什么开始,来决定以什么表情进行剖析,其中就包括了{、[、'、%、?等寥落符号的情况。以剖析不带任何寥落字符的字符串为例,简要的经过如下,不祥了一些不紧要部分:

皇冠体育

在这张图的中间设施中,创建了两个比拟紧要的对象ScalarToken和ScalarEvent,其中齐有一个为true的plain属性,不错承接为这个属性是否需要评释注解,是背面获取Resolver的要道属性之一。

上图中的yamlImplicitResolvers其实是一个提前缓存好的HashMap,一经提前存储好了一些Char类型字符与ResolverTuple的对应关系:

博彩平台攻略

银河娱乐官方

当剖析到属性on时,取出首字母o对应的ResolverTuple,其中的tag即是tag:yaml.org.2002:bool。虽然了,这里也不是简易的取出就完事了,后续还会对属性进行正则抒发式的匹配,看与regexp中的值是否能对的上,查验无误时才会复返这个tag。

到这里,咱们就评释注解昭着了ScalarNode中tag属性究竟是怎样获取到的了,之后活动调用层层复返,复返到OriginTrackingConstructor父类BaseConstructor的getData活动中。接下来,不竭践诺constructDocument活动,完成对yml文档的剖析。

调用构造器

在constructDocument中,有两步比拟紧要,第一步是揣度面前节点应该使用哪种类型的构造器,第二步是使用取得的构造器来再行对Node节点中的value进行赋值,浅薄经过如下,省去了轮回遍历的部分:

揣度构造器种类的过程也很简易,在父类BaseConstructor中,缓存了一个HashMap,存放了节点的tag类型到对应构造器的映射关系。在getConstructor活动中,就使用之前节点中存入的tag属性来取得具体要使用的构造器:

肯德基皇冠会员

当tag为bool类型时,会找到SafeConstruct中的里面类 ConstructYamlBool行为构造器,并调用它的construct活动实例化一个对象,来行为ScalarNode节点的value的值:

新2足球备用网址

在construct活动中,取到的val即是之前的on,至于底下的这个BOOL_VALUES,亦然提前脱手化好的一个HashMap,里面提前存放了一些对应的映射关系,key是底下列出的这些要道字,value则是Boolean类型的true或false:

到这里,yml中的属性剖析经过就基本完成了,咱们也明白了为什么yml中的on会被转换为true的旨趣了。

有网友扒出了他儿子在网上唱rap的视频,视频中他不仅做起了Ru华标志,

有网友评论说,不知道绍伊古那在伦敦搞音乐的儿子和梅德韦杰夫曾在美国开加油站的儿子是否会加入其中。

想考

那么,下一个问题来了,既然yml文献剖析中会作念这么的寥落处罚,那么要是换成properties竖立文献怎样样呢?

sw.turnOn=on sw.turnOff=off 

践诺一下规范,看一下后果:

不错看到,使用properties竖立文献随机通俗读取后果,看来是在剖析的过程中莫得作念寥落处罚,至于剖析的过程,有酷好的小伙伴不错我方去阅读一下源码。

那么,今天就写到这里,咱们下期见。

本文转载自微信公众号「码农参上」,不错通过以下二维码怜惜。转载本文请谋划码农参上公众号。

 



----------------------------------
栏目分类
相关资讯