粉丝2395获赞2.3万

在 spring 三以后的版本,我们的外部自动配置类将不会再从 spring 点 factories 这个文件当中去读取了。当然这个特性呢,在 spring 二点七的时候就已经提出了,只不过那个时候呢,他还依然保留了这种读取方式,也就是你的自动配置类呢,他还依然 会从这个文件当中去读取。那在 smart 三以后的版本啊,那就完全不会从这个文件去读取外部的自动配置类了。那进而呢,他会去依然是在 met in for 好吧,依然采用的是这种 spi 的机制,那之前呢,我管它叫做伪 spi 的机制, 因为它之前我们的外部自动配置类的方式呢,是必须采用 key value 的方式进行配置。你这个 key 呢,必须要叫 enable out configuration, 对吧?因为这个 supreme defect race 里面啊,它并不仅仅只是配置我们的自动配置类而已,还有很多的 supreme 部的,它的底层的一些对外的扩展,也都是通过这个文件来进 配置的。所以你必须要明确,这个文件他并不是完全废弃掉了好吧,还有很多 spring 部的底层对外的一些扩展,他也通过这个文件去配置了。这个文件还存在,只不过呢,只是我们的外部自动配置类,不通过这种方式不通过这个文件去配置了好吧, 而是呢,去这个 met in for 的 supreme 文件夹的这个 out to configuration 的完整限定名点 imports 这个文件一行一个自动配置。好吧,这个配置方式呢,比我们之前要简洁的多,并且呢,更加的遵循了我们的这种 spi 的机制。 spi 的机制大家应该都知道吧, 假如说不知道的可以去在我的视频下方留言呃来获取一下这个 spi 的简单的视力代码。我之前在讲 spring 部的原码的时候呢,就给大家看过,对了,本视频的文档我已经整理好了,并且与往期内容一起汇总成了二零二三年最新家法面试文档,放在了视频的最后面,坚持看完一 定对你有帮助。其实 spi 的机制很简单,我稍微提一下,就是在 met in for 的这个呃固定的位置,必须放上以一个接口命名的文件,然后这个文件当中呃配置的类必须实现了你的这个文件命名的这个接口。 那么在程序当中呢,就可以通过 spi 的方式呢,直接去加载对应的这个接口里面的实现类了,这就是完整的 spi 机制。好吧,那 spring 三的这种方式他就更加的遵循了 spi 的机制。那我在这里呢,还给大家写了一个简单的代码去证明啊, 我主要呢是看一下,确实定义在这个文件当中确实就没有作用了,必须写在新的这个送配置类当中。好吧,那么他的这个自动配置类的这个配置类的文件既然变了,那么他的元嘛,肯定也变了,我稍微带着大家去看一下, 我相信看过这个自动配置类的加载过程的同学应该都知道读取配置文件的这个代码具体在哪里,对吧?我在这里就不详细的去去带着你一句句代码去过了啊。假如说有同学之前对 spring 部的自动配置类原理都不知道的话, 可以去找我之前讲过的对应的视频去看一下, ok, 那我们自动配置类的这个加载原理呢,是通过这个启动类的注解 springboard application 这个入口,然后呢通过这个 enable out configuration 去启动自动配置类,然后通过这个 import 的去导入了这个自动配置类的一个选择器, 那在里面呢,它调用了一个 get out of configuration enter, 那这些代码其实跟三之前的代码都是一样的,它唯一的区别呢就是在这个里面 get candidate configurations, 就是这个获取所有候选的自动配置类, 在这个方法里面啊,他就会去读取我们对应的这个自动配置类的一个文件了,那之前呢,他是去读取这个文件,对吧?那现在呢,他调用了一个新的方法 input candidate, 点漏的注意啊,他这里传了一个 out of configuration 点 class 的类, 那传这个是用来干嘛的呢?其实你猜也应该猜得到,他其实肯定就是用来拼接这个文件名的,对不对?我们进来看一下是不是这样的, 你看啊,他在这里呢,就通过 string 点 format 字符串的这个格式化的方式呢,将这个字符串也就是这个文件的绝对路径,将这个站位符呢给它替换成了 auto configuration 的完整限定名,对不对? 就是传进来的这个 out configuration 的完整限定名,一替换就是这个文件的绝对路径。然后呢通过内加载器去加载所有加包当中的这个文件, 然后呢放到这个 import candidate 这个 list 当中,那这个 list 当中呢,里面它就获取到了所有的自动配置类,当然它获取到之后呢,还会经过一遍筛选,因为里面的自动配置类并不是所有有效的自动配置类, 这一点能不能听懂?因为我们自动配置类你看啊,他现在呢,会从哪个里面去读呢?会去从这个 out configure 这个里面,好吧,也就是你要去实现一个 spring boot 干 web 干 start, 那他会自动的把这个价包给你依赖进来,然后这个里面就啊给你配置了一个 web 应用所最基本的一些自动配置类,那里面很多,你就比如说这个 rabbi 的 although confirmation, 这个肯定就没有用,对吧? 那肯定首先呢会通过类加载的方式,看你这个类能不能加载到,对吧?这是第一步筛选,如果能加载到这个自动配置类呢?它还会根据那些 conditional on 什么什么的注解,这个注解大家应该都认识吧, conditional on property, conditional on, class conditional on, 并, 对吧这样的一个条件注解,看你当前的这个自动配置类是否满足这个注解的条件。就比如说我自定义的这个 starter, 我里面呢就用到了这个 condition 的 on property, 也就是你必须在你的全局配置文件当中有这个属性,有这个图,零点 hello, 点 name, 有这个我的自动配置类呢才会起作用。你像我在这里引用的我自定义的这个 starter, 我就 配置了这个属性,那么我们的自动配置类才会起作用。也就是说他把你的在这个方法当中,他把 你的所有自动配置类读取到之后,也就是文件当中所有配置的读取到之后呢,他还会筛选一遍, 知道之后他还会调用这个方法进行筛选。怎么筛选呢?我刚刚已经说了,第一步,通过类加载的方式,看你的那个自动配置类是不是能加载到。第二步,通过孔滴声哦,什么什么的注解,看能不能满足这个注解的条件,如果这两个都满足的话,他就会视为一个有效的自动配置类来进行加载。 好吧,所以说在这里呢,我主要是告诉大家,我们的自动配置类将不会再从这个文件当中去读取了,但是这个文件呢, 依然会保留,好吧,因为我刚才说了,这个文件当中除了配置自动配置类以外,很多的 spring boot 的底层的都会扩展,它依然是通过这种方式去配置,你看很多对不对?依然保留了,你看这个 key, 它就不是自动配置类, 还有很多,好吧,所以说他依然保留,这一点你要明确啊。那第二点,我们的这个自自动配置原理,他以前读取这个文件,那现在肯定就要读取这个文件了,这个原代码我也带你们看过了,好吧, nice。

在日常开发过程中,接口参数教验是个必不可少的工作,比如飞空教验,油箱格式教验等。那么在 spring boot 项目中怎样进行教验呢?这里可以通过 yludit 框架,通过注解的形式解决参数教验问题。 看一下代码实力。这是一个 supreme 部的项目,这里我引入了一个外流 data 依赖,这里有一个优色 d t o, 有两个属性, uc 内幕还有邮箱, uc 内幕是 b 天象。邮箱需要对格式进行交验,那么这里咱们就通过这两个注解对输入字段进行交验。咱们通过原码可以看到这里面的注解。常用注解还有很多,比如这里面的最大值,最小值, 还有咱们的数组长度进行交验,看一下保存接口,如果使用交验的话,必须加上这个注解。最后咱们需要对交验失败的异常进行处理,这是 一个全局异常,并且指定了异常类型,并且对异常进行了统一结果返回封装。对于全局异常处理和统一返回结果封装,不知道的小伙伴可以看这两个视频,通过 postman 调一下,看一眼效果。这里输入了用户名和正确的邮箱格式,咱们调一下, ok, 返回的是成功。如果这边我去掉用户名,咱们调调一下,他是名称为 b 天象,这样,然后如果说咱们在这写个不正确的邮箱格式呢?他会打印名称为 b 天象。邮箱格式不正确,看到交页已经生效了。这边还有两个问题, 第一,如果没有符合咱们的胶原注解怎么办?咱们可以通过自定义拆除胶验,看下代码视力,这是一个自定义注解,鉴定了取值范围,并且指定了胶原类,这个类呢也比较简单,它实现了 y 六对特的接, 并且判断了当前那个输入值是否在取值范围内。那他的使用方法也比较简单,比如咱们看这个性别,这个性别呢,只允许输入男和女,然后咱们通过 postman 调一下, 这边呢,比如说我只输入个一,咱们调整一下,他说性别只能是男或者女,咱们再输入一个男, ok, 执行通过了。第二个问题, 咱们在开发的时候,可能修改和添加接口使用的是同一个 dto 对象,保存的时候呢,这个 id 是非必添的,但是在修改和删除的时候是必添的。那怎么处理呢?这里可以通过分组来解决定一个分组的接口,这个接口比较简单,实现了一个 defout。 然后呢再在使用注解的时候指定分组,在调用的时候呢,也指定分组,这里面有一个 c 五,咱们这里没有指定分组, 而在 update 的时候呢,指定了分组。教验,咱们通过 postman 调用一下,看一眼,这是保存接口,保存接口的时候呢,他成功了,这里没有 id, 在修改接口的时候呢,咱们同样没指定 id, 咱们来调用一下, 它会提示 id 不能为空。最后有需要视频中源码的小伙伴关注并回复。

首先呢,点击这里边啊,有一个 services, 那么这个 services 呢?我们在这一个位置会看到有一个加号,点击啊,你可以看到它的提示叫做 add a service, 点击,然后这里面会出现一个 run configuration type, 点击, 然后呢往下来拖,你会看到有这么一个东西叫 spring 布特。好,如果你看不到的话, 代表他给你隐藏了,那怎么显示出来嘞?这块有一个叫十一个猫 items, 他会给你展示出来你最常用的一些配置啊,如果不显示的话,代表说我认为你不常用, 那你点击一下这个位置,他就全都给你展示出来了。这个时候是一定会有这么一个东西叫 springtood 的,你来点击一下。好,点击之后呢,你会发现出现一个特别神奇的事情,那就在 这里面呢,有三个服务,一个是 apoint, 一个是 register, 一个是伊维克 server, 就代表当前你正在运行。三运行的三个 spend 布特服务。 然后呢,这里面我们会发现有一个 rejectster application, 那这个 rejectster applick 审呢?是一个启动器,我现在怎么办?我现在要重新的再去给你启动一个,那怎么办呢?好,右键选择,这里面里面有一个 copycomb vigoroison。 好,然后呢,直接点击一下这个, ok, 我先暂时不去改啊,我们先来观察一下,你会发现在这里面有一个软拧是正在运行的,那正在运行的有一个啊, register application 的一个配置。 那再往下这块呢,有一个闹特 starty 的,也就是没有再运行的一个配置。那因为什么呢?因为两个服务啊,他同名了,所以呢,他给你加了一个小括号 一,就是让你不同名,那因为说,哎,我可以把这个名字换成不一样,那我可以怎么办呢?我可以右线啊,选择这块呢,有一个 id 的,我们把之前的那一个加上一个别名小郭号,然后呢搞上一个八零八零,然后来一个, ok 啊,你看他这块呢,就能够显示出来他是八零八零。 那这里面呢,我们这块呢是一个括号一,那我们再来 idasecomfeigeratt, 然后给它换成八零八一啊,然后再来一个, ok, 那你会发现在这里面你就会很明确的就会知道啊,这个是八零八零,这个是八零八一, 但是你注意你不能直接去运行,因为你没有配置他,让他用八零八一去启动,那怎么办呢?好,右键选择艾瑞特 convergration, 然后这里面呢有一个 modify options, 然后再来选择 environment virupos。 好,点击, 那这块呢,你需要去覆盖他原来的那一个配置,原来的配置是 seventypet, 我们需要让他等于一个新的值,等于八零八一。好,再来一个, ok, 那这样的话呢,我们就复制出来了一个八零八一的一个同样的一个英雄程序 好了,所以我们就可以右键选择这里啊,点击第八个就可以启动他,那么我们现在就可以来测一下,查看一下啊,八零八零零和八零八一,他俩是不是一样的 啊?我们等待他的一个成功,如果成功的话呢,会出现一个端口号,你看他出现了一个八零八一了啊,跟我们配置的那一个是一样的,那我们现在就来访问一下啊,八零八零斜线啊, register 斜线 carry 回车, 这是一个 rejects 的宽瑞,是吧?代表我们访问成功了,然后我们再换成八零八一,瞧一个回车,你会发现他跟之前是一样的。代表呢,八零八零和八零八一我们都部署成功了。好了,那这一个小技巧我就讲完了。

这是一个简单的 spring boot 服务,在浏览器访问服务的接口成功返回结果,如果在 console 里面使用 fat 方法来进行请求,把 local hose 换成幺二七点零点零点幺,会发生什么呢?是的, 这里出现了跨域报错。我们知道跨域是浏览器的一种安全策略,在不同域名、不同协议、 不同端口的情况下就会发生跨越。 logo house 和幺二七点零点零点幺在概念上是同一主机,但从浏览器的角度看,他们被认为是不同的域。 下面给大家演示几种常用的跨域方案解决方案。第一种是项目中最常使用的使用 nginx 反向代理。在 nginx 上处理跨域问题 主要就是这几行配置, allow origin 用于设置允许跨域请求原地址。 allow headers 用于设置跨域允许携带的 header 信息。 allow methods 用于设置跨域允许的请求方法, allow credentials 设置是否允许跨域使用 cookies。 另外一个很重要的事,处理预检请求。当发生跨越条件时候,浏览器会先询问服务器,请求方式是 option, 只有得到肯定答复, 浏览器才会发出正式的 http 请求。所以当请求为 option 请求时候,需求返回一个状态码。二零四,保存设置后重启 injinx 测试一下,我们把请求端口改成 injinx 监听的八八八八,让服务 使用 and drinks 的反向代理 local host 请求没有问题, fetch 的一百二十七余名请求也正常返回。结果,除了 end drinks 方案, 也可以使用 spring 框架本身自带的 at cross origin 注解来处理跨越。这里注解的参数, foreign drinks this is page of origin a law hatters a law methods 和 law credentials 不一样,是使用 adcross origin 注解时, spring 框架会自动处理浏览器发送的预检请求, 我们不需要像 in drinks 那样设置响应预检请求。添加注解后重启服务测试一下同样可以解决跨越问题。除了使用 adcross origin 注解解决单一接口的问题,我们也可以使用全 全局 mvc 配置的方式,通过实现 y bmvc configure 接口注册自定义的拦截器配置需要拦截的接口,还有和之前一样的允许配置。 重启测试一下成功解决跨越问题。上面就是给大家演示的三种跨越问题解决方案,希望对你有所帮助。

看一个需求,在微服务中通过日志查看接口的入餐、出餐调用地址,调用方法 以及接口响应时间,那么这个需求的目的是什么?是通过以上参数更好的了解接口的运行情况以及错误排查, 那它的实现方式是什么?是 aop 切面编程,那么咱们来看一眼代码视力。首先在这里定义了个 srid logo 接口响应的开始时间,定义了一个切入点,这个切入点就是咱们的 ctrl 层 在读必放方法中打印请求地址, url, http, messer 的 ip 以及方法,还有咱们的参数。最后在 retin 里面打印它的返回参数以及它的执行时间, 通过 postman 调一下看看效果。来控制台看一下日志, 这里边已经打印了咱们的请求地址就是本地,它的 i h t t p max 就是盖的方法, ip 地址就是本地的 ip 地址, 所调用的方法就是咱们刚才用的这个 save 方法,因为这个方法里没有参数,所以说参数为空,还有返回值以及接口的选用时间。

零到一教大家通过 id2 搭建一个 sure in boot 的一个后台的项目。首先打开 idea, 打开之后呢会有一个这么一个界面,然后呢点击 creating new project, 点击之后呢会有一个 spring 的这样一个按钮,然后这个呢会,你看有一个提示是创建 spring 布特的一个项目,然后呢因为它是爱第二集成了 stat, 第二 spirin 点 io 的东西,所以他就会自动默认的给你一些配置,点击下一步,点下一步之后呢,这里会去 呃编写你的组名称,你的项目名称之类这些东西,因为我们之前是用的 j 离开八,所以我们这里炸选择 j 离开八,然后呢这些名称根据你的需要改一下,我这里就不改了。然后之后点下一步啊,这里是那个你对应的项目的简介之类的 东西信息,然后这是项目的版本号, ok, 下一步。然后这里要注意一下,因为我们是做一个 spa 的一个项目,然后肯定是要写一些结果里的东西,所以要把这 spa 外边这个给选上 啊,其他的根据你的需求就行。 lovebok 是生成实体的一个该的赛的方法的一个组件啊,然后之后剩下的这些东西根据你的需要去加 啊,然后我们就暂时只加这些,然后点下一步,然后这是你最近的项目名称啊,我们就叫呆萌吧,就不改了,然后分你是完成, ok, 这个时候项目就在拉去代码,就在开始创建。 may even projects need to be imported okay, 这是 idair 的提示音,这个可以不用管,点那个导入对应的扎包啊,这个时候他就会去下载对应的门外的信息了。 ok, 现在是下载完毕了,下载完毕之后呢,打开这个之后看一下大体的结构啊。 ok, 这,这个,这个就是我们的启动类, spring 部长的启动类 啊,这里边存放我们的对应的配置信息,当然你也可以修改为 oppodyken 十点 y m l 的配置信息啊。 ok, 我们创建一个 ctrl, 测试一下对应的 这个四边布的项目是否能不能用。 ok, 我们创建对应的一个 啊,这个我们就叫做测试海螺 word 吧, 每一个程序员的第一个程序不都是韩罗沃的吗?对吧? ok, 盖子摆平啊,写一个盖子接口,然后这里呢,我们就打印一个 hello, what? ok, 他的短口号默认的话是八零八零,这个我们就不改了啊,如果你需要改的话,就是在这里设置一下你对应的短口号啊,我们改成八幺八幺吧。 ok, 然后这里我们启动一下。 嗯,看到这里有 start 带猫 application, 二点四零八秒啊,这里就能看到, 就证明他的体重成功了。好,这里我们访问一下这个借口哈,我们是八幺八幺,对吧?好, 嘿,啊, hello, word 出来了, ok, 证明我们的第一个 suring book 项目就搭建成功了。

今天来讲一下视频部的多环境配置文件,首先第一步就是创建两个不同环境的这个配置文件,一个是这个 dv 开发环境,一个是这个 pow w 型,就是生产环境创建了两个环境的配置文件,具体的配置内容、配置餐字,比如说这个数据库, 他的这个用户名密码是不一样的,那么就改成对应环境的这个配置参数的值就可以了。所以就是两个不同的这个配置文件,不同的这个配置数据, 这个时候就是已经配置完成了。配置完成了之后,那我们就是怎么找到到底用的是哪一个环境的配置文件呢?首先的话来看这个 idea, 在我们开发的时候, 这里可以看到这个配置,点这个编辑配置,找到这个环境就是这个 profile, 这个配置项这个值的话就是填这个 dv, 因为在 id 里面 我们是开发环境,所以这里填的是这个 dv, 就是开发环境,这里就是填了这个 dv 开发环境之后,我们就是运行的时候点这里就是运行的时候,运行这个项目的时候,他就会自动的找到叫 dv 这个名字的这个配置文件,也就说约定大于配置,你对你配置文件有叫这个名字的, 他就会自动的映射。那如果是生产环境,生产环境我们是要使用这个配置文件以及这个配置文件里面的这个配置数据,那这个时候怎么办呢?其实就是打包吗?就是慢慢打包,我们来看一下,因为我现在就是使用的是阿里云,直接部署到这个阿里云这里可以看到这里有一个慢慢的这个打包的这个命令, 这 clean 打包这里就是有配置这个参数,其中最后面这个参数就是杠 p, 杠 p 的话就是 profile 的意思,这个参数就是固定的, 拿来它的作用就是配置这个不同环境。现在我配的是这个 production, 就是生产环境,所以我就运行的时候它就会自动的 找到生产环境的那个配置文件的配置数据,他去打包。刚才讲的是这个阿里云,如果是这个普通的这个版本打包了,我们也是一样在这个打包命令后面多加一个参数就可以了。你加了参数之后, 他那个参数杠拼那个参数固定的,他就是表示指定用哪个环境的配置文件就是起这个作用的。
