00:00
好,接下来我们来说第九小节,我们如何在使用spring boot的过程中给它系统里边注入我们web的原生组件,而web的原生组件指的就是我们sole开发里边常用的三大组件,Sole filter listener。那这一章节对应的内容呢,在spring官方文档,在spring BOO官方文档,它对应的7.4章节有一个我们称为这个嵌入式容器的支持在这一块,那么想要给我们容器中注册filter和listen,它的这个方法呢?在下面也有说,我们可以使用第一种方式,我们来编写一些so,然后呢,使用so component sc,那我们以前要注入咱们这三大组件,我们是是把三大组件写好以后呢,我们配在web插中,那现在呢,使用SBOO开发,我们就来看使用第一种方式,它so select API的方式,我呢在这个包下,我们来选上一些类,比如呢,我们就在so这个包下来写一个MYSO,那so呢,既然它是一个原生so,我们就让它。
01:00
继承原生的啊,这个时间内有一个HTP,这个时间内我们当然也可以实现接口,那然后呢,接下来我们来标一个注解叫web,这个呢是我们这个select3.0以上规范给我们提供的一个注解,那有了这个注解以后呢,接下来我们要做的是我们来重写一个读get方法,比如我们这个呢,很简单,你请求给我发过来,我可以get write给你write一个数字,比如我们来写个666,那我这个S呢,到底能处理什么请求,我们以前是在外B插中配置的,那现在呢,我们就可以在这它呢有一个叫UR part,来我们来配置它的这个能处理的路径,比如呢,它就处理你给我发送杠MY请求,那我们就来来到这个S来进行处理,而且这个sol呢,想要能生效,那我们现在呢,默认是不能生效的,我们来启动,可以来访问一下我们这个慢请求,看能不能生效。我们在这来访问local host,我们这个请求慢回撤,来稍等一下,好,我们这个系统呢,启动起来来访问,哎,我们访问这个慢,我们来重新访问,我们发现呢,它让登录,我们即时呢,登录进来,走,我们再来访问这个慢请求,我们发现呢还是404,我们这个S呢,想要生效它的这个效果呢,就是我们必须除了编写外面S这个注解,这个注解呢,是我们S3.0给我们生成的注解,而且呢,我们还需要一个我们的这个注解,这我们可以在主配置类里边写一个叫solid component sky,这是spring加给我们提供的一个功能,那这样呢,它可以自动的帮我们写的这个扫描进来,所以我们接下来呢,在这就应该写我们的这个要扫描的这个包,那比如我们来写com点艾特硅谷,那我们不写这个默认扫描的包,那自然就是我们这个主配置类下面的包,以及它下边子包,它都扫描好,那现在。
02:56
那么一写以后呢,那所有里边,我们这些包里边只要有任何人,我们再来加一个命,只要有任何哪个子包里边它有都能扫描到,可以重新来测试一下。
03:14
好,我们来启动起来,我们来重新来访问麦请求来看一下啊,回撤稍等,好我们发现呢,它响应666,而且大家注意我们现在的这次响应呢,它没有要求登录,所以呢,我们这个sole呢,现在已经注过来了,所以我们说的第一种使用原声sole API的方式很方便,我们必须呢使用这两个注解来进行配合,第一个注解呢,就是我们说的这个叫select component sky来指定我们这些原生的so组件都放在哪,它的这个作用呢,是指定指定原生so组件,原声server late组件都放在哪里,然后呢,接下来我们来再来结合一个注解,我们写了一个sol,我们就来结合我们这个注解叫外BSO,我们来相当于来声明了我们一个sol,接下来呢,它就可以使用了,而且它的这个效果呢,就是。
04:14
我们发现它似乎没有啊,效果就是我们直接响应,直接响应,然后呢,没有经过spring的拦截器,因为我们做了登录检查的这个拦截,没有经过spring的这个拦截器,为什么没有,大家可以先思考一下,好,那我们SONE呢是这么来做的,那filter也一样,我们可以参照官方文档,官方文档呢也说的非常清楚,你可以使用web so web filter或者web listener来注册三大组件,那这三大组件呢,我们一定要使用component sky,把这些组件呢,自动的给它扫描进来啊,自动发现,所以呢,我们接下来再来测试一个,我们比如自己来写一个filter,比如我们就叫my filter,那这个filter呢,我们必须来实现filter接口,Filter接口这是我们这个so里边,好,我们来找是张XSO的这个接口,这个filter接口呢,我们现在有一个do filter方法,那我们来这个filter呢,就必须使用一个注解叫web filter。
05:14
这个web filter呢,还是我们sole规范里边的,然后呢,我们可以在do filter里边写逻辑,但unit里边我们知道这是filter初始化,会调用这个方法,At一个self forg,我们可以来打印一下log,点一个info,这是filter初始化了,My filter初始化完成,然后呢,这是我们这个filter的销毁,我们也可以来打一下,那么项目一停以后呢,这个就是filter来销毁了,销毁呢,它回调这个方法,我们真正的过滤方法,我们调用的是它,那我们可以在这来,来我们这个filter呢起作用,Log in来我们这个my filter工作,然后呢,再来,接下来我们filter呢,想要放行就拿到filter列,然后do filter就行了,把它原生的request response放行啊,这是我们以前filter的写法,来看这个filter能不能起作用,而且呢,每一个filter都有它拦截的这个路径,比如呢,我们现在静态。
06:14
资源没人拦,我们可以让这个filter拦截所有的静态资源,那我就可以这么来写filter,它的这个拦截路径在它里边呢,有一个我们的这个叫UR part,我们来找一下啊,它有没有我们的要拦截的这个路径,这个路径呢,也是一个数组,我们可以拦截多个路径啊,那我们想拦截多个,比如我们拦截的第一个,第一个呢,我们拦截CSS下边的所有请求啊杠芯,哎,这个呢,我们现在注意单星呢是我们S写法,双星呢是spring家的写法,所以我们这个担心放在这,然后呢,再比如我们图片下的所有请求,我们也想要拦截它静态资源下,如果你发图片,你的这个请求路径是当前项目下的图片下边的所有请求,好,我们来看一下我们的这个filter有没有生效,来启动起来。
07:05
而且呢,我们发现我们的这个filter呢,我们相当于没有拦截哪个路径,没有拦截我们这个慢这个访问路径,所以如果我们来访问慢,我们的这个filter是不工作的,来刷新,好我们这个filter呢,不工作,这块日志没打印,但如果我们随便访问一个页面,访问了一段样式,它呢就会有打印来随便访问一个样式,当前项目下的CSS下面的某个样式,好这个访问成功,但是我们菲这一块呢,已经工作没问题,因为我们说的它指定拦截这个路径,这是我们filter,包括listener啊,我们来原生的组件,我们再来写一个listener listener呢有很多,我们就以一个listener为例,比如我们以这个so contest来监听我们项目启动的这个listener为例,我们就叫my so contest listener,让它来实现我们的so contest listener接口,好,这个接口呢,我们必须给这个listener上标志,一个叫web listener啊,说明它是一个监听器,这。
08:06
监听器说明了以后呢,我们接下来可以来重写的方法,比如有一个contexttest initialize和contest destroy,它分别来监听我们当前项目的初始化,它呢,如果我们这个方法打印说明我们当前项目已经初始化,Solid conest已经初始化完成了,你就可以log.info,然后呢,我们这个监听掉,监听,监听到项目初始化完成,初始化完成。然后呢,我们也可以来写一个他的这个contest的destroy,这个方法好,那么这个呢,就是监听到这个项目呢,销毁项目销毁。那么来测试一下我们的这个listener有没有起作用,启动一下。我们来看控制台,只要我们项目一启动就一定会打印,我们这个话稍等一下好,我们的这个solid contest listen呢,监听到项目啊,我们的初始化完成,如果我们这个项目停了以后,那这一块呢,我们当然是点的这个是关机按钮,所以这一块是没有销毁,那我们正常的这个项目的stop才会有销毁啊,我们这个相当于直接拔电源,所以呢,我们现在呢,没没有任何问题,我们的web包括呢,我们的这个web filter web listen,我们一定要结合呢这几个来进行。
09:32
好,把这几个拿过来,一定要结结合这几个注解来进行开发,我们的这个原生组件才能注入过来,这是我们注入的第一种方式,把这个再拿过来,那么来看有没有注入的第二种方式,而且呢,我们也是推荐,如果我们原生的组件呢,我们也推荐可以使用这种方式,当然还有一种方式就是使用我们说的reg b,我们可以来给大家看一下这种方式怎么用,按照spring的官方文档,我们spring BOO的官方文档,我们除了使用select原生API,这它的select component sky注解,加上原生的这几个注解外,我们还可以使用它的这个我们称为叫registergry being,我们来看一下啊,上面有没有说这个事啊,我们来看啊,有一个叫so registerry being和还有我们的这个filter,还有我们的so listener,所以呢,我们可以用这几个我们的这个组件注册。
10:29
把这几个我们拿过来,我们来测试一下啊,我们也可以使用它,我们来使用它,如果使用这种方式呢,就非常方便,比如我们把这几个呢,我们给它重新注掉,好,我一旦把它注掉,那相当于没啥用了,我们不是一个,不是一个,呃,这不是一个so,不是一个filter,不是一个listen,就是一个普通类了,那如果我现在来启动,我都把这个注解注掉了,你就算加了solid component sky肯定也没用。
11:00
来看一下啊,我们的这个慢请求现在能不能生效回车,好,没用了,没问题,然后呢,接下来那我们还可以用另外一种方式,就是使用spring底层给我们提供的这三种registry b,然后呢,来测试一下。我来写一个非常简单的配置,哎,MY,哎,My register configuration,我的这个注册配置,我们要用这种方式呢,很简单,我们只需要来写一个配置类,哎,只需要写一个配置类,然后呢,我们把它们放到容器中,比如我们来放第一个我们叫regist being,好,Registration being,然后呢,我们就叫,比如我们这个叫MY,我们把它放到呢容器中,然后接下来我们给里边怎么注册组件,我们必须new一个my sol,就是我们的这个原生的sol组件,我们已经写好了,是它,我们想要注册进去,我们来就new一个它,然后呢,最终return回一个我们称为叫selectgration b的这个东西来点进来它的这个里边呢,我们看它能传一个so,还能传一个map屏路径,所以呢,我们就可以使用这种方式,我们把我们的select传进来,然后。
12:18
那再把我们要映射的这个路径,比如我们要映射MY请求,你想要一个select处理多个请求也可以,比如MY02请求,那都可以。好我们so letter呢,就这么注册进来了,包括filter listen呢,都是一样的效果,而filter呢是使用的是filter registerg b,好,我们比如呢,就叫my filter an b,我们来给它放到容器中,然后呢,同样的我们必须return回一个我们的你有一个filter的registerg being,好,然后呢,在它的这个beingin里边也一样,构造器里边我们传一个filter,这个filter呢,在我们来看一下啊,这个filter它在这传了,相相当于我们这个filter到底拦截哪些so,但然我们当然也可以来传一个,因为它继承这个,所以我们可以来传一个我们当前是哪个,然后呢,它来拦截哪些路径来看一下啊,它这块呢,也有我们的这个路径来看有没有一个有参构造器能传一个,呃,Filter还能传一个路径。
13:18
来找一下CTRL f12来看一下它这个构造器有没有直接能传一个filter,并且能传一个路径的在这诶我们发现这一块好像没有找到,我记得以前是有的,我们来做一个测试吧,我们来直接写,那么就new一个g be,那么接下来new一个my filter,这是我们自己的filter,我们这个filter呢,我们先来传进来,接下来这个filter拦截哪些路径,甚至于它用拦截哪个,那我们可以把我们要拦截的这个so大家看啊,我们点进来,它可以传一个叫so registerry b,那也就是如果我们把MYSO这个东西我们来传了进来的话,那它呢,相当于就是拦截my select,它是啥路径,这个filter就拦截啥路径,哎,这是我们的第一种写法,我们来启动一下。
14:15
也就是说呢,我们这个filter呢,专门就拦截买跟买零二路径,其他路径呢,通通不来,我们可以来做一个测试,看我们的这个filter有没有生效,好,我们来操作买,然后呢响应666,而且呢filter也工作了,然后呢,我们买零一来做一个测试啊买零一我们是零一还是0202好,它呢也666,我们这一块菲也工作了,但是如果我们来访问其他的请求,我们这个菲才不管,我们比如写个麦四,然后呢,我发现菲呢啊,我们来看啊filter这有一,这还有一个filter工作,它是不是打印错了,哎,重新问一个就叫MY回车。好,我们确定啊,它没有拦截好没有问题,所以呢,我们现在呢,就是我们这个filter只拦截我们这呃,Solid select规定的路径,这是第一种,当然我们要自己写路径了,也可以使用第二种return,用一个filter b把我们的filter传进去来看哈,有参构造器能不能写磁缀,好我们发现呢,它不能写磁砖,那不能写磁砖呢,我就把这个拿过来,我们给它设置上一个拦截路径就行了,好,这是我们的filter的这个注册宾,我们让它注册B专门呢有一个叫set URL,我们来找一下啊,看有没有set,那ul patterns,好,没问题,我们要拦截哪些路径,这是一个集合,我们可以把我们这个路径的集合给它传进去啊,比如呢,我们来传上一个们的collections,我们弄一个arra.as list,好,我们要拦截的路径,比如杠慢,这是第一个路径,然后呢杠CSS下边的啊。
15:55
所有请求,然后呢,我伽曼拦截一个精确的,再拦截一个CSS下的所有的确认一下。
16:03
这是我们注册的这种方式。那注册listener呢也一样,那就是listener的GB。我们来测试一下,好,我们现在来访问麦没问题,我们这个麦呢工作了,我们来看一下我们的filter有没有工作啊,我拦截的是慢刷新刷新。好,我们这个filter呢,工作了没问题,然后呢,接下来我们来访问CSS下边的我我们来访问它的不strip me,好,我们来看一下啊filter,好,Filter呢也工作了没问题,这就是我们说的这个filter,包括listener呢也一样,只不过listener呢,它的这个叫啊,So listener listener rery being,好,我们呢就叫my listener,我们的这个listener呢,我们先new出来,New一个my so contest listener,这是我们的监听器监听项目,项目启动的,然后呢,我们return一个new一个so listener To Be,而我们要return回去的它它呢只有一个有参构造器,我们传入一个这个listener,当然它也有无参的,我们把这个listener一传进去就行了,然后呢,我们这几个呢就也又都生效了,可以看一下这个效果。
17:26
来看一下listener在启动的时候有没有打印啊,我因为我们这个listener在这创建的这个listener,这个listener呢,在项目初始化的时候,它有一个打印到监听到项目的这个初始化,诶这块呢,没见我们来重新测试一下,启动一下。那这还没有打印,我们可以来看一下这是什么原因,那我们注册的这一块啊,我们发现呢,把它给容器中没放,所以大家一定要注意啊,把它放到容器中来启动起来。
18:13
好,我们现在再来确认一下我们的这个,诶我们应该是监听项目一启动,看他有没有打印,有打印就行。好,我们发现呢,它打印了我们的listener也进去了,这就没问题了,这是我们说的,我们如何给容器中放我们的so filter以及这些listener组件,而且里边呢,这里边也有一个细节,有什么细节呢?我们来给大家提示一下就行了,大家注意我的这个configuration,我在这呢,我写我没有写,这个叫proxy being muscles等于false,那我们之前已经解释过,为什么什么时候写它,什么时候不写它,大家想一下啊,如果我写了proxy being muscle等于force,说明呢,我们当前类每次一调要用它类里边的方法,然后呢,这个sol都会新建一次,每次呢都会新建一次,所以接下来有可能会导致是这样子的,如果我们的这个filter配的是拦截这个,然后呢,我们一调这个方法,一调这个方法啊,这个一调这个方法呢,这个方法又被调一次,相当于我们这个呢,就重新又扭了。
19:26
一个新对象,这样呢,我们可能倒不会导致功能上的问题,因为我们最终主要拦截的路径是根据so light的这个路径来的,但是呢,会导致我们容器中呢,有冗余的很多乱七八糟的其他对象,所以呢,这是我们说的第一个我们的细节,那第二个细节,这个呢,就是我们保证保证,然后呢,我们依赖的组件,依赖的组件始终是始终是单实力的,所以如果我写成一个处,它就是保证是单实力的,否则呢就不是单实力的,所以我们明显的把它写在这啊好,这是我们说的,这是第一个细节,第二个细节我们让大家考虑了一下,那为什么我们的这个solid没有没有被我的这个拦截器拦截,好大家先来考虑一下,来下节课解释。
我来说两句