00:00
来再接着看啊,这个类local我们不去看那么细了啊,后面的话,这个应该还会有机会再去深入的去讲解,比如说我们类local,它还有一个什么呢,叫可继承性的local。什么意思呢?我们当前这个local线程和线程之间,如果一个是负负进程,负线程,一个是子线程啊,父子线程之间,他们的信息是不能共享的。那么我们可以通过另外一个local可以能够做到父子线程之间的共享啊,那个会更麻烦一点。其实如果让我们自己自己去写它底层的代码,它底层的逻辑其实也非常好写。这个我们就不再去扩展了啊,下面我们抓紧时间,我们把filter过滤器咱们一起来看一下。叫监听器啊,说错了,Listen了,叫监灵器啊。来,回到这边来。好,上午呢,我们这个当中的基础知识点呢,我们讲的是filter是吧,叫过滤器那行,咱们下面看一下listen。我们的内色的呢,目前呢,我们的绿色呢,主要有八个,稍等一下啊。
01:01
呃,这是事务管理。事务管理我看一下啊。好,下面再来第三个。第三个叫精灵体。我们主要有八个。第一个。第一个。第一个我们称之为叫contact listen。叫。这个单词有点长,咱们把它分开看,你先看前面的这是什么。是不是啊?是不是斯上下文啊,哎,关于上下文的一个监听器,这个监听器用于干嘛呢监听。监听conduct。Conduct对象的产生。和或者叫创建嘛,啊,创建和销毁的过程。
02:01
那么什么叫监听?我们得先搞清楚啊,监听。比如说啊,这个我党对吧,一直这个在监视着台湾的一举一动是吧。这个如果这个台湾的这个顽固分子是吧,如果他们还是比较识趣的话,那那那就没什么大问题,对吧,还是本着尽量的以和平的方式对吧,去去这个去把它收回来。啊,那如果说我们一直在监视着,一旦他有一些不好的一些苗头,是吧,咱们立即要做出一些措施。哎,是这意思吧,这个叫监视的,叫监听者。其实这个监视的,监听的,这其实用的是什么呢?叫观察者模式,咱们早就用过了。你想一想,我们在javascript里面是不是有事件的监听啊?当一个按钮被点击on click,当被点击的时候,我们要去执行一个方法是吧,同学们,那就是最初的叫监听,监听了他的点击事件。啊,叫观察者模式,一直在观察着,什么时候被点击,我就什么时候出发,指定好的时间。
03:01
OK。那么第一个listener,它指的是我要去监听这个对象的创建和销毁的过程。第二个是什么呢?第二个我们叫HTTP。Http session。它是用来去监听筛选对象的创建和销毁的过程。HTTP。好。监听HTTP筛选对象的创建和销毁的过程。第三个。第三个我们的对象是叫request。绿色的好。Request。监听。Request。或者叫request吧,啊,监听request对象的创建和销毁的过程,我们先把它写下来。
04:04
这三个,他们是一组。啊,123这三个他们是一组。我们的接灵器当中有两个方法,一个叫什么什么initialize,一个叫什么什么。你当前是request listen了,那行吧,那就是request request。那你如果你是HTTP线,那你看一下上面一个HTTP线类型的,它对应的就是三线create,三线创建,三线destroy,三线销毁是吧。再对。不用死记硬背啊,不要去死记背。好了,这是我们监视我们三个对象的创建和销毁的过程。再来,我们再来看下面的。下面一个是什么叫attribute?呃,加了个attribute attribute,我们什么时候接触过的?
05:02
我们是不是在保存最域的时候接触过的?那行,你看一下这个方法。EB added。Attribute removed。Replaced啥意思?是不是当你这个属性有添加,属性有删除,属性有更改或者叫替换的时候,我们会分别去触发这三个方法呀。当我们去执行application at,这个方法就被错发。当我们执行application remove at,这个方法就被触发。啊,当我们重新往里面去修,修改的时候,去替换的时候,哎,这个方法就会被触发。就这样的。我们把它写一下。第二组。Context。Attribute。监听。Contact保存作用域的改动。
06:02
就这样的啊,这个改动。有添加的时候。有remove的时候,还有replace的时候。再来。下面一个你猜一下呗。同学们。下面一个应该是什么。你保证中意这是application啊?保存中原还有啥呀?你是不是还有三星啊?第五个httb session看到了吗?那保存作用什么?是不是还有个叫作用啊。那行,这是这一组有三个。我们写一下HTTP筛选。Attribute。Listen。监听HTTP筛选的保存稍等啊,不写了啊,保持的改动。就这样的。下面一个。HTTP。Request稍等让我看一眼,我感觉好像没有这个,我看一下啊。
07:04
没有HTTP看到了吧,前面没有HTTP啊,删掉request,当然大家你不用记这么细啊,因为这个一般不会让大家去死记硬背的。这个是用来监听,拷贝一下吧。监听request保存作用域,Request保存作用域的改动。好了。看一眼吧。这是三线的。你看是不是A的remove replace一样的吧?再来request。Remove replace,一样的吧,啊,没问题。好,这是这么这么三个啊第二组。那行后面两个稍微有一点点小特殊。还有两个第七个和第八个,第七个叫HTTP叫叫绑定,绑定的一个list子呢。啊,监听某个对象在赛前域里面的创建与移除,这是这个对象,还有一个是监听某个对象在赛线中的序列化和反序列化的这个过程。
08:07
啊,就这样的序列化,我们称之叫动画。反虚的话,我们称之叫活化动画,就是冬眠。内存里面的对象是活的,我们把它对象序列化到磁板上去,把它钝化啊,把它冷冻,冷冻的磁板上去。反学的话叫活化。活化就是把。磁盘上的这个对象,把它重新激活,重新加载到内存里面去,变成一个活动的对象。啊,这个叫活化,也叫反序列化。那这两个呢,比较特殊啊,这两个比较特殊,不过呢,咱们也应用不到啊,大家做个了解好吧,对大家这个没有要求啊,我们把它写下来。第七个我们用的是叫HDDB线绑定。筛选。这个单词叫绑定吗?绑定嘛。怎么绑定这个绑定这个词就是从这个谐音过来的啊绑定那什么。
09:03
好,就这样子。监听。监听某个对象在赛前域中的创建和移除。就这样的啊,鉴定某个对象在在线域里面的创建与移除的过程。好,再来一个。下面一个是HTTP。HT session。啊,在赛前中的序列化和反序列化的过程。监听某个对象在三线域中的序列化。和反序列化的过程。上面这个创建和移除啊,是不是指的对象的创建,以及把它移除掉是吧,把它取消绑定。啊,下面这个是什么?下面这个是序列化和反序化老师,这个啥叫赛前域中的序列化和反序列化。
10:00
啊,大家应该都包括一些错误,有些时候咱们通开在启动着,你点了一下刷新。你点了一下刷新re deploy,重新部署,他们该怎么去重新部署呢?他会把你内存里面的已经存活在内存里面的一些对象先给你序列化到磁盘上去,然后再重新部署,重新部署完之后再把磁盘上序列化的对象再反序列化到内存里面去。这样呢,你通get刷新的时候呢,他就把你之前的一些数据,诶,就能够能够不会丢失。那么这个时候呢,大家一般控制的都会报错误叫的,没有实现序列化接口。见过吗?我觉得每个同学应该都见过,只是你可能没注意过而已。啊,他会报个错误叫的对象没有实现序列化接口。啊,为什么会出现这个错,就是因为你在刷新Tom get的时候误Tom get想把它内存里面的数据先暂时性的先序列化到磁盘上,一发现这个内存里面这个float对象啊。他没有时间虚的话接口,那没有时间虚的话,接口是不是就不能续的话是吧,同学们哎,那他就报这个错误了,没关系啊,就大家一脸茫然啊,没关系,一会儿我们再演示啊。
11:09
那么我们就简单的演示一下,第一个这个这些接听器呢,对于大家没有要求,你先简单知道一下,好像听说过有这么回事。啊。来我们看一下,第一个叫conduct,咱们一起来看一下啊。我现在回到这里面来。我在这个com at硅谷下面我来新建一个。Listen。那么我新建一个叫MY。Conduct listener。我新建了一个叫my listener。它是不是会监听我们application对象的创建和销毁的过程啊?Contact listener。那么实现两个方法。
12:01
一个叫一个叫destroy是吧,同学们好。那么在这个初始化方法里面,我们就打一句话。啊。当前的上下文对象。初始化动作。被我监听到了。只要我这句话被打印,那就说明上下文啊,你初始化的时候,我的方法被执行了吧?再来下面一个方法。我们写一下。上下文。上。上下文对象啊,销毁的动作。动作被我监听到了。好,就这样吧。那行,这是一个listen了。注意这个绿色呢,咱们需要去配置。你要不在这边配置。Web。为什么?啊,你可以在这边配置叫web listen。要么你不在这边配置。你在配置文件配置也可以。
13:01
我们找一下配种件,找个找到他。那行吧,咱们在这边写一下绿色呢啊,大家不用担心,不要像这么麻烦啊,搞了八行。例子呢,比较简单。Listener listener class。我MY。这样就配好了。啊,这样配就配好了,人家说老师他不需要什么U2去让别人访问吗?他不需要,他是监听器吧,别人是不会主动访问的是吧,他一直在悄悄的隐藏着呢。它什么时候会被调用,是不是它的,它对应的事件。被他监听到的时候才会去自动调用啊,所以不是别人主动访问的啊。我们来试一试。现在我把这个程序启动一下。稍等一下啊,PRO20咱们先把它删掉。然后回到这边来。我们找到artifact。
14:02
好,我们加一个。我们加一个幺九,好把它加进来应用。然后再回到这边来,把幺九把它部署进来。点加号幺九。把这边全部删掉可以吧。好,我们把这地址呢,把它改一下,地址呢,其实无所谓,幺九我们以前访问的是啥来着。我们已经。看一下吧,这里面写的是啥我忘记了。这里面。随便吧哈点度吧,行吗?我还写的是新年度是吧,新年度那这边我记得有个是吧。的叫啥?是不是叫戴姆零幺?啊,代码零要点读行吧,就这样吧。然后好像这个代码01点度会给我转发到SUCC页面是吧。行,差不多启动一下。重点不是想看他跳转到哪里去啊,重点咱们看一下这边能不能监视到,看一下我们这两个方法在什么情况下会被执行。
15:15
来一起来看一下啊。你看这。是不是啊?的上下文对象出手化动作被我监听到了。因为我当前是不是context的一个内了呀,那么contact什么时候被创建啊。当简的上下文什么时候被创建?我这不说过,通盖的容器启动的时候,当前的这个料的上下文是不是就开始了。什么时候结束?是不是把通盖关掉啊,那行,咱们试一下。停一下。你看。是不是他的销毁动作就被我鉴定到了?你看这应该还是比较简单的是吧,基础的语法应该来说还是非常简单的。那这一点我也把它说完了。
16:02
那具体的这个solid connect listen呢?它有什么应用呢?来,我们一起来看一下。好。视频我就不断了啊。我们回到PROJECT20这个当中,我们还需要做一点小的优化,我就不再去建一个新的项目了啊,直接在这里面去写。同学们帮我一起来看一下,我这里面有个小的细节。在我们的。Dis当中大家帮我看一下啊,在dispa当中。我们在这个初始化方法里面,我们做了这么一件事情,能看到吗?看到了吧,它是在中央控制器。在中央控制器被初始化的时候,我们去,我们去初始化了这个叫LC的工厂。其实我们最好的方法是什么呢?最好的方式是当我们当前的这个上下文被启动的时候,我们LC工厂最好就给我准准备就绪。
17:01
当别人使需要使用组件的时候,直接去设置给别人。而不是说当我这个中央控制器被初始化的时候,你才急急忙忙的去初始化RC容器。好,我再说一遍,我们这个RC容器,我们应该在上下文被创建的时候,被初始化的时候,我们就应该要初始化这个RC容器。这样呢,我们启动的这个性能稍微低弱一点点,但是呢,我们整个系统的响应的性能应该要高得多。所以下面我们就来做这个改造。所以呢,这句话注释掉。不要了。当然这句要注释掉之后,你这边没有6CLASS pass xman application,那你说这个B是不是就等于none了?它等于now,是不是也就意味着它里面那个冰map是不是也是now,也是now,是不是你就获取不到CTR了,然后service do是不是都没有啊。
18:02
哎,就这样子。好,现在我们需要把这个工作移到我们的listen当中去。所以。我需要在这个地方,我来新建一个。我这边写的叫ROC,这个怎么叫IO呢?重新命名一下。咱们应该要重命名,哪一个来着,我忘记了。这个我们把它改成LC。Redirect。改过来了吧,好。这边应该都没问题。我们看一下这里面调用回到这里面来。IOC这边是还是叫I是吧,那么它B的应该会报错吧,我们让它编译报错,然后我们再去修改,能听懂我在说啥吗?就是我这个报名改掉了,但这边他这边没自动改。选中它,点build。Build model。然后他给我编译报很多错误啊。
19:10
嗯,不报错。不可能。稍等啊。嗯,不报错不可能不报错啊,稍等一下啊。把这边全部删掉。把这边的也删掉。然后再重新build一次。哦,这个是阿,Exception是吧。哦,怪不得他不改变,应该在这儿。哎,他变过来了是吧。哎,是吧,同学们那没问题啊,这个下午眼睛看花了是吧。那这个没问题,估计我这边就没问题了啊,但是我想给大家讲的就是万一他没变过来,你build一次,然后是不是报一大堆什么不能识别什么包啊。那你就双击直接去修改嘛,省得你一个类一个类里面去找吗?能听懂我意思吗?同学们OK行吗?再继续啊。
20:00
再来。嗯,下面我要做的事情是。我在当前的这个包里面,我来写个listen的。Listen。我写一个叫。Context。Loader。Listener。啊,叫connect load conduct上下文load加载器,上下文加载的这么一个鉴定器。然后呢,我让他实现我们刚才的contact。然后重写两个方法没错吧?冲洗这两个方法。好。那么我需要在初始化的时候。我需要在初始化的时候,我要去执行一一件事情。当然了,这个event我里面是可以获取什么呢?点get,你看是不是可以获取上下文啊,这个是有用的啊,这个是有用的。好,我们回到这边来,B factory注意看啊。Factory等于new。
21:01
克拉斯。Pass xm application conduct。然后。然后我已经得到这个b factory,我需要把b factory保存到application作用域,所以我就通过它得到。得到我们的application作用域。Conduct。好,其实就是application。然后application。Set attribute,那我们这边我就写个叫factory。好,Factory把它保存进去就行了。我就做这么一件事情,那请问一下我们的中央控制器还需要再去六这个这玩意儿吗?不需要。我在我的中央控制器里面,我只需要去获取就可以了。所以get solid contact。Get solid?是不是获取上下文啊,获取我们的application。
22:01
Conduct。Application。获取到application之后,application.get attribute,是不是我们要去获取b factory啊?是吧?这样我们就能得到一个对象。Object。兵。Factoryg等于它。If。Factory obj不等于now。那么,Factory。等于强转移项b factory。作弊键把它放进去。就是这样的。我们就完成这么一个过程,当然,Else,你可以去抛一场。思路。6RUNTIME exception。Factory或者叫LC啊。LC容器啊。ROC容器叫创建。获取失败。啊,加RC容器获取失败,就这样子。
23:02
那么你看我这边的过程,我就不再是当场去溜了,而是从罪里面去获取。那么作用域当中的这个对象什么时候创建的,是不是在我们这个listen里面,我们容器在启动的时候,是不是这个这个工厂就会去创建啊,同时把我们往application里面,Application里面去保存。那行,我们这边可以写一个web list。啊,或者我们说了,我们可以在web.X文件当中,我们可以去写。啊,我们可以在这边举行也是可以的,也是没有问题的。这样吧,我还是在这边写吧,咱们刚刚是在web DX文件写的啊,现在我就写个注解吧。叫web写完了。那写完之后不知道行不行啊,咱们得需要试一下。回到这里面。啊,这个对象我们得要来看一下这对象这玩意儿到底有没有,我把锻炼师到这儿行吗?我把盾点放在这儿啊,咱们一起来看一下。
24:07
把它删掉,新增一个。再来回到这边来,把它删掉。咱们新增一个,把它加进来PRO20。应用。然后回到这边来,我们对应的应该是二零杠。点是吧。哎,没错吧,对。应用。OK,再启动好它启动的过程,我们稍微来加加上一丢丢注释啊。当前这是个监听器。监听。监听。上下文启动。啊,在。上下文启动的时候。去创建LC。
25:00
东西是吧,同学们。然后。将其。保存在你跑哪去了?哦,知道你跑上来了,稍等一下啊,然后将其。保存到application作用域。啊,后后面。后面。中央控制器。在从。Application。租用玉中去获取LC容器,没错吧?就这样子。那这边咱们断点已经到这来了,咱们往下走一步,看看这对象到底有没有啊。下一步看着对象。有的报。是不是啊,B factory obg是有的,所以它不等于往下走,不等于就能获取到,哎,设置给b factory,所以b factor里面,你看一个b map b map里面有三个组件,Fruit fruit service,还有fruit do。对的吧,没问题,跳过去了啊。
26:00
稍等一下啊。把断点全部去掉。好,回到页面上去啊,那就应该有数据了,下一页下一页你看都没问题。是吧,同学们啊,他是也是没有问题的。好,这是我们这一步的一个改动。好,回到这边来。那么这里的话。这里的话我们要写写点注释啊。之前是在此处。主动创建LC容器的。现在。啊,现在叫优化,优化为从application作用域。去。就用玉。去获取。就这样的啊,现在我们要优化为从application中区去获取。准确的来讲,你这个despite这是一个中央控制器。中央公制他的角色是什么?他的角色应该是MVC的当中的角色。
27:01
而我这个ROC容器是从整个应用程序的所有组件的管理。这两字的角色是不搭嘎的。啊,所以说我们如果在PA里面去完成这个RC容器的创建啊,那这个就就显得有点有点倒过来了。严格意义上来讲,我这个b factory这个LC容器,它的这个角色要比我们当前的中央控制器要大得多了。啊,中央控制器他只负责做一些转发嘛,把你的请求过来找过来啊,想接收到你的请求,然后把你的请求对应到某一个control上去,是吧,同学们。而我们这个ROC容器不是这样的,ROC容器它是我们控制层。业务逻辑层,数据访问层,以及这些层之间的依赖关系的一个一个注入是吧,都是归我们这个LC容器管。行,那我把这个代码再稍微做一点点小的优化啊,因为我这个里面是硬编码的,同学们,我在这个class pass这个里面它是硬编码的。
28:02
你看一下。你敢在这里?在这里你看是不是读这个配置文件啊,也就意味着这个配置文件的名字你你不能写错了,你不能把配置文件的名字写错了,写错了是不行的,所以呢,我们可以在这个地方呢,我们可以把它写成pass。表示从外面去读嘛。然后我可以在外面。我再来写一个。Private pass等于application。给他一个默认值嘛。啊,然后。然后在这个里面。If有。啊,假设你穿的是浪,或者这样吧。这样啊,稍等一下啊。我再给他一个构造方法放在这儿。我在这里面,我是不是要去调用this把这个。Application不写了啊,直接拷贝。从这到这拷贝,把它放到这儿行不行啊同学们。这个无参的,是不是就调用下面这个有参的呀。
29:02
啊,然后这个pass怎么办呀。社保的放在这儿。对吧,就可以了。当然我们可以在这边做个判断。If u.is empty pass。如你的pass有问题实录。Run time。Exception。啊,我们说一下叫OC。容器的配置文件没有指定。可以吧,你没有指定就这样的。否则我就按照正常的下面的步骤去走。那么我们再回到k load listen里面,我们这边调用的时候,你可以不用调用这个,呃,不用调用这个午餐的,你可以调用有餐的,那么它这个pass怎么获取呢?他怎么获取呢?这个我们说过,它可以获取,这个叫咱们把这句话放到第一行。
30:00
然后。Application get in是不是有啊?A,我们可以写一个,比如说叫呃,叫contact。Config。我写了个名字。啊,叫con location。子俊,Pass。然后把这个pass把它扔进去。OK,就是这样的,那么我就需要配一下这个初始化参数,所以我再回到web.X文件,我要在这边再配一下。Contact,然后这个叫。Configu location就是它,然后我们这边就要写上application context.xl,这样就没问题了。啊,就把它配成这样,这个爆红你别管他。因为这个idea啊,D的软件,它认为我们在这边配的是什么呢?我们在这边配的是我们的,呃,Spring spring的配置文件啊,实际上认文件是我们自己写的,现在我们还没讲spring呢,是吧,那么ROC认为你这个文件有问题。
31:00
啊,他认为有问题。好了,不用管啊,配上就行了。那么我们再回到这边来,所以呢,所以呢,我们在这边再读取的时候,我们就可以读到了,只要我们配上这个你就可以读到。啊,就可以把它读到,然后把它扔进去。那行吧,咱们再来启动一下试试。好,我们把这个注释写一下啊,这第一步。第二步。第三步。第四步。稍等一下啊。第一步。获取的上下文。对象。第二步,从。啊,或者叫获取。上下文的。你看是不是也可以啊。没问题啊,也是没问题的,OK。获取。上下文的初始化参数。第三步。创建。
32:00
LC容器。第四步。将LC容器。保存到application作用域。这样我们在装央控制器里面就可以从保存中域去获取了。假设我这玩意儿忘记配了。注释掉。我忘记配了。停掉。再启动。我们看一下他会不会给我们抛异常。好,这边没问题。我们回到页面上去呀,页面还能访问。嗯,怎么还能访问呢,他应该给我抛异常啊。
33:00
有的吧。他会给我有异常的。啊,应该是有异常,怎么有异常还能访问到页页面上内容呢。这个这个也太奇怪了吧,稍等一下啊。清楚。清除掉。再刷一次。应该是不行的啊,应该是不行的,现在我是不启动着呢是吧。应该没问题啊,再试一次。再启动。好,这边报错了,我们回到页面上去应该是不行的,我觉得。是吧,报错应该是对的啊,咱们应该记得要报错啊,这边已经报错了,他说文件没有指定。
34:07
那行,这是我们所说的一个精灵器啊,咱们就举这个例子就可以了。咱们今天讲的这个知识点其实不多。啊,但是呢,可能这个就事务管理不太好理解。Conduct。意思呢?啊,我写了一个叫。Listen。好,就这样吧。那行吧,咱们今天主要就讲了这么几个,第一个是过滤器。第二个是事务管理。啊,第三个咱们就讲了一个监定性对吧,主要就讲到这个啊呃,大家今天晚上的时候呢。
我来说两句