00:01
那么。既然你。这个他实现不了对吧。他也不是不说。不是说实现不了对吧,他是说他的这个。然后我们。把他的这个入餐拿过来。这样就实现了是吧,你说他还是需要去判断。即便你的这个实现类已经是在不同的实现里面了,它还是需要去判断,对吧,它还是需要去判断。那么有没有一种方式,就是说我不需要去。不需要去这样对吧,去判断了,因为我不在,我就不太,我就是不想写这个意意术,在策略模式的基础上,我不想写这个依术判断,对吧,有没有一种实现方式。然后在我们。呃,需要这个实现类的时候,他就能够拿到他这个实现类。
01:01
呃,根据我们这个登录类型,嗯,他去动态的去获取到它的时间类。这样呢,我们第一呢,把所有的方法都实现封装在这个实现类里面啊,我们只需要去关心接口啊,调用哪一个实现类就可以了,其次呢,我们这个if就可以省略掉了。对吧,那么他他就是一种什么思想呢。我们引入了一个什么思想,叫做SPI啊PI,什么是SPI呢?SP是一个service provider interface的一个缩写。它它是一个。啊,JK内置的一种服务发现机制,可以动态的发现服务啊,也就是说当你调用框调进来之后啊,你调到这个接口,接口有N多个实现,嗯。它这个调用包是跟接口之间的这个互相发现,他发现发现这个接口,这个接口提供一些实现,这就是一个ST。
02:02
我们有可能有些人是第一次听说这个ST啊,那我们正常听说的一些东西是不是叫ati啊。叫SPI叫API是吧,叫application application programming interface啊什么意思,就是程序之间的这个啊,程序之间标的一个接口。那么服务之间呢,就是说相对来说,它发现的是一种服务,所以叫做服务发现机制啊。那么。我们知道了SPI之后,那我们怎么应用这个SPI啊,PI有。去实现刚才我们说所说的这个功能呢,那我们首先就看一下它的这个分类会有什么。呃,SPI的分类有JDK自带的spi,还有spring实行一个spi,还有wpi。然后我们先对吧,先用一个。
03:01
JDK自带的一个PI,然后去实现一下。它的实现方式是什么呢?我们先看一下。可能我这个对,我这个对吧。我自己的这个是JDK11,那可能有些人是JDK8,那JDK8的话相对来说要更要更明确一点啊,比这比这个11要。呃,比那个11要明确一点,明确一点是什么东西呢?要实现啊,叫做JDK的一个servicepi,叫做service road的一个类。啊,他在什么位置下面。效率高啊,尤其下面有一个service service load啊,然后service load呢,在如果你是DDK8的话,如果你是DK8这里有一个什么perfect啊,它直接有一个路径啊,那么在我们JDK11呢。
04:02
它叫做maybe。嗯。Music。嗯。Amazingz。Lady。啊,Thez class啊,Lookup是下面这个,它定义是fic,定义在这个位置叫made info下面有个service。So it says。啊,它有一个这个路径,它会扫描这个路径加上你的服务名称啊,你看加这个service就是你这个类型的接口的一个。实现类的一个名称啊,接口的名称。他用这个前缀加上这个接口的名称啊,去加载啊,这个方去加载的对吧,通过读取你这个class的,通过读取这个系统路径去加载的,对吧。那我们我们。
05:01
回的项目中怎么实现啊?我们新建了一个。动态登录的一个接口叫做dynamic login service,它有一个动态登录这个方法。它有一个什么实现呢,就是把刚才的这个啊。密码登录和验证码登录给拿过来了。只是拆成了两种实现对吧,没有什么复杂的一些实现啊,区别在于什么?区别于在于这个验证码登录呢,没有注入这个map,这个账号密码登录呢,注入了这个map。那我们怎么去应用呢?首先我们需要根据刚才这个service。Service啊,我们新建一个文件夹。啊,它不是有一个吗?把这个pre拿过来在什么下面呢?在resources下面新建一个文件夹叫info。然后呢?过来设备费。
06:03
然后它它有一个这个perfect拼接的时候用的什么叫服务的名称,服务的名service名称对吧,这个类或者是接口的这个服务的名称大概。它需要建造的比较。我们把这个。复制一下他的这个权限的列名。他新建了一个文件,就叫service这个权限里的命名,好吧。就叫这个东西啊。然后呢?我们把这个。13类。他两个分别有两个时间类对吧,拿过来OK。他的一个。它的一个应用方式啊。JDK的一个mpi的一个应用。这样呢,就直接调用我们那个service load啊,把我们那个service拿过来。你在实现的时候就可以这样的。
07:02
Service road。点load load这个接口是什么?就是这个dynamic service。就是一个你log in我们。对吧,它有一个漏的方法,然后呢。它是一个返回的一个service load的对吧,然后呢,他这里私例里面直接包意识是因为它没有什么实现,那我们就是需要自己去编利一下。编了一下这个漏,然后因为我们这个所的呢,它是需要传参的,所以我们不能像4D这样写是吧。然后我们把这些东西拿过来啊。然后我们再重新启动一下。然后先得爸爸。对吧,看看能不能加载到,看有没有什么错误。重新启动好了。
08:02
等于启动完事啊,完毕。八上。我有没有加的到啊。There is no的。看他有没有感觉到。我们就不看一个那个具体的实现,它这个赛季。应该是没有加载料是吧。在家快到了。他的小也是。他答应了什么?但是他有没有发现它加载到了对吧,他说两个登录方式都已经都都都都调用了,对吧。那么,如果你只配了。我觉这。如果你在这个service下面如果只配了一个,那它是不是就只需要打印一个了?
09:02
只需要这样一个对吧,你再重启一下。我们只配了一个。这个。账户名密码登录一个。That。那我们再表扬下。嗯,当前登录方式是用户名密码对吧,这也可以正常调用对吧,没有问题。那么还有是还有一个方,就是还有一个问题,就是说如果当我们配置了两个的时候,他把两个都给调用了,但是其实我们是希望。其实我们希望是只需要调用一种,对吧,这只需要调用一种,那么但是呢,它是不支持,因为你你。你是需要有多个实现类都要配在这里,但是你只要加载一个,那是它实现不了对吧。然后我们可以看一下。这是JDK自带的一个SPI,它的一个实现方式。
10:02
那么我们再看一下这个。Spring自带的一个SPI对吧,Spring还它还有一份PI。他们他这个SPI呢,它在什么地方,在这里。我们。跑到这个启动的一个流程的一个入口。要找什么样方法,用方法对吧。这个启动流程。我相信大家应该都看过,多多少少都看过是吧?我这里呢,就不过多的介绍了,简单说一下他大概对吧,他要记录一下开始结束的时间啊,那开始在什么时间,记录在什么时间,对吧,监监控了一下启动的流程。下载一下上下文,准备一下他这个监听。啊,我们打印一下banner对吧,这些我们就不看了,我们着重看一下,有一个叫get run listen这个方法。他去获取了一下这个方法的spring工厂里面所有的实力,嗯。
11:03
它是根据什么获取呢?它是根据这个内容啊,根据这个内容去获取的。但它真正里面的实现呢?到最后是什么?Load spring factor。他其实这个的那个。SPI呢,它就跟JDK的这个SPI呢。就是说非常的相似。相似的,相似点在哪里呢?它有一个。我们看一下啊。我们GDK的SD是通过。盖了一个system那个加载是吧,System加载,那么它还也有一个。Get resource that是resource的这个什么?叫做meetin for spring factories。对吧,那我们看一下这个factory是个什么东西。
12:00
太想你,你对吧。我们发现有很多地方都用到了。然后我们自己找到下面拉一拉。一平不疼,哎。它这个自带的有个made in for对吧,Made in for。它这里有一个spring的factor。但他这个呢。跟我们这个JDK的这个配置呢,基本上啊不太相同,因为我们这个叫做JDK的叫什么SCI叫什么,叫做接口的一个权权限证命名放在这里叫做文件名这个,但是它是把接口的实现。跟它的实现类啊。建筑对的形式配置的,我们看一下,验证一下它的这个。它是一个接口,它有四种实现对吧,那它在它的这个。配的这个电座里面,它就是有它的其中三种直线都配在这个地方了啊。
13:01
看他是不是啊,他确实是实现了这个。那以此类分的,它的这个实现方式都是一样的,也就是说在这个它读取了made in。Spring factories下面的这个文件里面的间级。对,以此在他。启动spring启动的时候就获取到了它这个加载类。对吧,就获取到了,那我们也模仿他也写一个。我们刚才呢,在照片里面建,建了一个那个英镑下面建了一个service。然后我们把它删掉。新建一个什么文件呢。要点。De。看一下它上下的这个。是否一致,应该是一致的啊。
14:00
那我们把这个service拿过来。Service。他的全身全现金为名拿过来。然后等于它的两个一个实现。放到我们那个里面。然后等他,哎,那好。多个呢?有多好的隔开?然后这样就可以隔开了,嗯。这个是不是跟它是一模一样,只是一个换行符对吧。就可以分开了。然后我们启动的时候呢。不用去这样去写了,有一个spring。Factory factory factories,那你其实也是了,它加载的也是这个时间内对吧。
15:09
然后呢,它有一个获取一下这个。这些类所有的这个加载器,然后获取过来。然后我们还是要严厉对吧,还是要把连过来看它能不能实现对吧,它也是spring的一个spi对吧,看他能不能实现,我们启动一下。诶,刚才我们把这个入口的bug开了。没关。我再重新测试一下。它返回来一个处。但是他成功是成功了,但是它那个登录方式也是一样的,对吧,你配了两个实现类,他把两个实现类全都给调用了,对吧。OK,那么有JDK的,不管是JDK的PI,还是spring的SSP。
16:01
他虽然都能动态的去获取到它这个接口,具体的实验类不需要我们再去写这个E了。但是其实我们只需要对吧,因为我们声明的一个类型是第一种只需要调用其中一种。就我们并不需要那么多种这个丝线。对吧,我只需要这个调第一种就可以了,那么有没有这个方法对吧?它能不能实现呢?这个load factory这个方法它能不能实现呢?他其实不能实现啊,因为你它就是它实现就是这样子。他确实不支持,但是他能不能支持呢?那我们点击这个叫做。101行就有一个叫做load factor name,它根据这个名称,这个class load是什么呢?因为你这个class load是你传进来的,它不会为闹,所以说这个就是class的,就是你想要的那个class。传进来的不会为空,这个class类型呢,就是你这个service,这个service类型。
17:05
然后呢?下面的一个再看一下下面的事情,你那个也不会re not对吧,如果没not的呢,它会把首先这个默认的这个加载器会加载进来,对吧,系统的对吧。然后看一下下面的图片,它根据这个工厂的一个名字。啊,实例这个病的名字。他家呗。它有一个开这里,嗯,Catch是什么呢?就是一个缓存,它加载了一个。啊,它需要放入的呢,就是一个间谍豆一个缓存啊,一个初始的,还有一些必必要的一些缓存些。他根据这个下面配置的。读取我们还是读取我们这个配置对吧。然后呢,他去便利啊,他去根据名称,他去便利它那个名称对吧,里面的一些元素,这里呢,是根据读取过来这个。这个N去做一个逗号分割,分割完了这每一个这个实例名称,这里有个问题,就是说如果我们允许在这个放循环里面判断一下。
18:11
如果你这个name是你想要的那个name。OK,那么就中断这个循环,外层循环也中断,V循环也中断,然后这个catch不需要再往里边放,那么它就会返回一个。它就会返回一个。就是能够达到,就是说指定了我们这个class的service来获取它具体的实现类这个效果。那我们为了这个节省时间呢,因为我这边已经提前自己试过了啊。就是我自己实现了一个spring factor extend,就是拓展,然后把它注入到这个spring管理里面。其实我就是把它那个原样代码就是封装过来啊,直接根本拿过来,对吧,只是在这个叫做load factory name里面做了一个改变,做了什么改变你看。
19:06
什么白的?它缩小一点看一下。在这个load factory road factors。我们看一下它最终这个name里面是没有什么区别的,没有什么区别的。唯一这有一点区别,就是说no factor里面,我把这里给拿过来了。就是哎呀算了。我直接把这个放到idea里边,好看一点是吧。好看一点。那我们。还是建在这个。就叫spring factory好吧,然后呢,我们就把它那个。
20:02
直接趴过来。当你调用这个load factories的时候啊,它最终调用了这个name,然后呢,这里有什么区别啊,你看它这里对吧,它获取到名字之后呢,它就是根据这个class的,或许它是是否是默认的,如果它是。啊,它是否是默认的,如果是的话,那就默认值,如果不是就返回一个空集合对吧。然后呢,他根据这个。Factory names返回的这个集合,然后再放到这个result里面做一个倒叙,对吧?这样来实现的。我们在实现之前我们再重新。
21:01
重新看一下,重新看一下好吧。你在启动类里面看一下。那还有没有过去的?对吧,他去读取。读取了,读取完了之后看一下类型的有没有。Listen。你直接把它放过吧,因为我们直接看。直接就可以看那个。但他直接调用的时候都加载了什么东西对吧。
22:07
变得突然,变得有点慢了,他说application context开始初始化了,对吧?然后我们调用的时候,在在我们这个service里面把一个。他为什么没有直接,就是为什么能够直接获取到,就是因为它在启动的时候,嗯,启动的时候已经加载过了。然后加载的这个。实现类就第一个实现类,就是这个我们实现类的权限的类名,对吧,就是这个名称对吧。然后。然后获取的时候,这个可以打出来对吧。注意,这里需要指定service,指定它一项病的名称啊,否则它会。否则他会获取不到。他这里如果你不指定。不指定的话。
23:00
会报错的。因为你是他这个是根据内容去获取,你不指定的情况下。获取不到对吧。也能获取到,因为默认的是有的,默认的是有OK,我们还是接着就是说这个刚才我们那个扩展类啊,扩展类。然后他拿过来之后呢,我去做了一下便利对吧,做了一下变电,把你一个这个。把你这个list string返回了啊,然后加载的时候呢,它也有一个map。就指这里有一个意思,如果你是这个工厂名称是我想要的这个OK,那我们这个循环中断,循环中断呢,在result里面,如果它不是空,因为你已经result的已经A过,把我们这个想要的已经A过了。啊,已经进去了,他如果是空的这个V循环也也也去退出啊。大概代码就是这样一个代码啊,那他。
24:00
对吧,能不能起作用呢?我OK,我们试一下,我们试一下看能不能起作用,对吧。他去加载,它去加载等于一个实现类对吧。嗯,那我们它有一个,我们能不能获取。你想大是怎么写的?他获取的这个属性类。就像那个。做account点。Class。你这是需要一个class。那我们便利呢,其实它它是返回一个list,我们不需要再便利了,我们自己去把它那个实现直接。
25:08
就不需要去便利了,因为你自己在自己已经实现了嘛,那你就。不需要返回这个result了,对吧,不需要返回这个result。你因为你只需要一个嘛。那你就。And the first。你自己去。自己去改造一下对吧,这里是为了这里是为了什么?这里是为了跟他保持一致啊,我们如果你自己去写的话,就first只返回一个,把这个泛型改一下就可以了,是吧。那我们为了把它保持一致,然后看一下区别,看能不能起作用,对吧。我们再重新试一下,看看能不能起作用,能不能获取到我们。这个想要的这个。
26:02
啊,有天雷他能获取到的。你没有获取到是吧。因为我们写的有问题啊,后续我们可以。调一下。啊,大概意思就是这么一个意思啊。因为这个我们提我是提前,呃,我们再试一下,我们再试一下。这里呢,给它改成一个。它或许呢,还是一个dynamic series,然后这里面有一个。Dynamic。No。然后它有一个对吧。然后根据我们登录的一个类型,然后获取的一个class。能不能实现对吧。
27:12
还不是。我们刚才在这个直播里边已经配置了,对吧,那我们得大的走一圈。对。
28:20
能获到能获到吧,它这个是不是叫做account password m对吧。它是能够获取到的。然后所以它中断了对吧,中断了之后再往下走,它这个已经有值了,所以说也中断了对吧。然后他这个后续的循环呢,都是一样的,它都是一个东西。拿过来之后你就把尽量放掉就可以了。他就不会往里边再加什么乱七八糟的了。呃,这个factory。他这里返回空。那证明你这个。
29:00
这里写的不太对,我觉得是这里写的不太对,对吧导致的。Part value。他是有一个。对吧,它是有这个值的。好,里面是我们这个。方法写的不对,大于应该是大于零了,这种情况下。因为我们是已经获取到其中一个。所以说我们重新启启动一下。问他是不是因为刚才那个判断的有问题是吧。诶对吧,就是这个刚才筛选的是大于一的,其实我们就有一个,就所以说他获取不到对吧。
30:03
看一下能不能能不能指定,可以指定是吧。啊,问题出现在这里,我们配置了两个,但是我们可以实现,可以实现这种对吧,指定实现类去加载,然后我也我们也可以通过改造去把它不变成对吧,去不不是实现这个便利的方式,而是以这个返回某一个对象去调用这个时间内。但是呢?他也有缺点对吧,它有什么缺点啊,我们直接就先把它,我们看到这个就没有。它有一个获取数据库,它自带呢,有一个获取所有用户。用户的这个。方法,那么我们走一下,看它有没有什么缺点。当前我们也是通过自定义实现的这种方式。去调用的这个接口,但是它有没有缺点。
31:07
那有什么缺点?报错了对吧,报了个控针,那这里怎么会是控指针呀。这里位置控制帧是什么?就是我只是写了一个数据库的一个查询方法,对吧,它就控制帧了。嗯。我们在。点一下发送。干点什么事?他这个不管是JDK的啊SPI。还是spring自带的一个PI,他这个spi全部都是通过什么。EVO方法是什么?反射的方式去获取它的这个实现类,所以说它相当于拗了一下这个MGL,如果你不去做这个其他的,调用其他的猪肉是没有问题的。
32:01
当你调用的时候,这个相当于你有了一个。病。那new了一个病,它当然是now呀。所以他才会暴恐,真的。也不是说啊,你这个对吧,有人说你这个改造的有问题,那好,那我们把这个。拿回来对吧。还用我们自带这个,不用自带这个。登SPH实现。对吧,然后我们再看一下他有没有什么问题。是不是一样的,是不是一样,都是控制圈,都是通过引爆,都是反反射的,是不是。所以说这个方法有一个缺陷,就是说如果你不写,不写逻辑是没有问题的。如果你把它删掉,刚才没有报错嘛,对吧,第一次我们没有报错嘛。
33:03
当然你不可能不写逻辑对吧啊。除非你真的就是说你这种。业务操作完全完,完完全全就是处理数据的,当你处理完数据之后。啊,你再去啊,你只是做一个,你不可能说不去操作其他的病对不对。所以说他还是有缺陷的。这个我们后续再讲,对吧,它是有这个改造的方法的。然后后续课程呢,我们可以介绍一下。Double的s SP double这个SSP设计的是非常优雅非常对吧,有意思的一个ST啊,他就能解决我们刚才所说的那个所有的问题。后后面呢,我们会优化我们所有的ST的方式,以注解驱动。然后后面对吧,可以搭配这个多多线程是吧。暂时呢,暂时呢,我们这个第一期就先录到这里。
34:01
那后续呢,如果有什么问题可以随时联系。然后我这个PDF啊,他自己有一个PDF和那个代码什么的都可以发给大家看一下,因为我自己写的这个代码不是特别好,对吧。单身呢,只是为了?举一个例子给大家看一下啊,好吧,有什么问题希望大家随时联系。
我来说两句