00:00
项目呢已经搭建好了,接下来呢,集成框架,那我们该怎么做呢?其实很简单,那其实你们之前也学过类似的,我们这里呢,就应该有一些什么东西啊配置文件。而且咱们前面讲了,咱们其中有一个配置文件是非常重要的,这个重要的配置文件就叫web点叉L,是整个web应用的核心配置文件,它里面配置了我们当前的整个环境,你的框架集成就应该有跟它有关系,所以打开web点插打开,打开之后,那么它里面就会包含了很多的内容,咱们一点一点给它增加上,首先咱们先把这个拿过来叫集成spring框架,咱们先把这个咱们拷贝。所以拷贝啊,来拷贝,拷贝以后咱们打开我们外B的叉L把它打开啊,那么这里呢,我就直接把刚才的内容呢,我就原封不动给它拿过来了啊,就是这样,诶给它稍微的挪一下啊好了,那么这里面我们说了要集成spring框架,那么集成它的时候,为什么我们要加一个监听器呢?那是因为在web服务器启动的时候,我要加载这个web应用,你加载web应用的时候,你要保证当前的环境已经初始化了,所以同学们看啊,也就意味着我们的服务器啊,服务器它启动的时候,要保证我当前的什么外部应用里面的内容可以被初始化,所以这个时候呢,会加载我们的spring啊,就是这样,那你加载spring的话,这个时候就会有一个功能叫做listener,叫监听器,这个监听器监听的就是服务器的启动状态,只要你启动了,我就开始执行,这个监听器它跟什么很像,跟我们的那个叫斜处理器很像。当什么什么发生的时候,我。
01:40
该怎么怎么办?当你的服务器启动,当你的外部应用对象创建的时候,我该怎么怎么办?诶,一个道理,所以我们这个监听器专门是用来初始化整个spring的环境的,那这个监听器有它就完了呗,为什么还要加它呢?原因就在于我们监听器它是要读取spring的配置文件的,Spring是有配置文件,它不可能在程序当中把所有东西都写死了,这样的话扩展性非常的差,所以啊,它会把一些我们的配置放在系统之外,那么我们在这里呢,就会有我们的插lil,所以啊,我们这里呢,有一个叫contact的perel,叫做我们的环境参数上下文参数,这个参数叫做context的configure location是我们环境上下文的配置路径,那么这个路径它会指向一个位置,这个位置在哪啊,什么东西啊,叫class pass星啊,它描述的就是我当前外部项目当中的什么,诶class pass叫内度镜当前。
02:40
Web项目的路径,我们说有两个,哪两个呢?下面的一个叫叫,还有一个叫,那就意味着呀,我需要在web info下面来创建我们的两个文件,但是由于你是在idea里面来开发的,所以这个时候啊,我们根本就不用管它,为什么呢?因为它可以自动把咱们程序当中的内容呢,给它编译到里面去,非常的方便,所以在这种情况下,我们这个暂时不管了,我们在闷上面加东西加什么呢?点击new。
03:12
咱们这里面应该创建什么呀,创建我们的两个文件夹,同学们看我们这个地方点一下,点一下我们的闷在这儿,他下面应该有什么东西啊,有加va和resource吧,我们这并没有,所以我的手动给它创建出来,咱们创建我们的它,咱们叫做什么呢?叫做我们的Java,嗯,好,然后呢,你创建完加va之后,再来创建一个点我们叫做resource啊,我们来我们叫做resource好了,点击完成以后,颜色肯定还是不太对,所以还得点它选择我们的模块,选择我们的Y吧,那么这个时候点一下我们的Java,应该是我们的resource resource呢,应该是我们的它,嗯,好,点击应用,点击OK,那这样的话,他们两个其实就是我们的class pass,那我这里就明确的告诉你了啊,从这个位置去查找一个插的文件,这个文件是有规则的,什么规则啊,首先它应该在某一个文件夹里面,这是第一点,第二点它应该以什么什么开头。所以啊,这个配。
04:13
配置文件咱们应该事先准备好,咱们就不要自己再手动创建了,这个呢,咱们事先呢,在这个位置就有,它就是spring的文件夹,打开里面会有两个配置文件,其中有一个就是以spring横线开头的,所以我接下来呢,就把这个文件夹呢给它拷贝,拷贝到哪里去啊,贝到我的resource当中对吗?因为我们这是配置文件,它不是源码啊,所以放到resource里面是更好的,所以点击OK,那么在这里面就会有两个配置文件了啊好,那么有了这两个以后,你会发现这个红色的那个字体啊,马上就变黑了,说明找到了啊,就这个意思,所以提升框架,咱们先说到这里,这两个配置文件咱们一会儿再说,那我接下来往下走。这个咱们做完了以后呢,咱们接着呢往下走,下面呢是集成我们的VC框架,所以把这个呢原封不动再拷贝过来,拷贝的时候我们直接往下来,诶这个时候我们集成SPVC框架,那么我们集成SPVC框架的时候,这时候有一个叫做什么东西啊,叫做我们的so啊,这个啊咱们就要给大家稍微的介绍一下了,叫什么呢?咱们的这个MVC架构可不是什么框架都能称之为叫MVC架构,它有一个特殊的要求啊,什么要求呢?它叫它叫前端控器啊,这个呢,我们大概的了解一下,所有的MVC架构当中应该有一个我们的前端控制器啊,这个呢,既然说到这儿的话,那这样给大家呢,简单的说一下这个事情啊,来以后你们写程序的时候也要考虑这种事情啊,对啊,这里呢,我们简单说一下,这是我们的一个架构方面的东西啊来那比方说来咱们现在写上,那这里写上以后,这比方说是我的服务器服务器。
05:57
当中有我们的什么呢?比方说有个叫user controller,咱们叫user controller啥意思啊,是不是叫用户控制器啊,对吧?用户控制器啊好了,然后呢,那我们这边画完以后呢,我再来一个啊,再来一个什么东西呢?比方说我们的那个叫view啊,咱们叫U的view啊,咱们叫view啊,其就视图就页面呢,好,那我现在我不考虑那个model的事儿了,我现在呢,CTRL出来调度干嘛呢?你发一个请求,我就跳转页面,跳出页面呢,给你返回页面就完事儿了,所以啊,咱们这边有一个客户啊,客户他要发请求了,发请求过来就可以了,这样的话走controller,然后走view,然后跳转页面返回去就完事儿,那么可是不光只有controller啊,还有我们的什么东西啊,比方说还有我们的E呢,还有我们的student呀,所以我们的他也有相应的我们的他,然后呢,把这个呢给他拖过来好了,那么我们说了,除了emp以外,还有呢,我们写上叫student简写啊,咱们叫。
06:52
简写SKU,嗯。然后呢,把这个呢拿过来啊,拿过来,拿过来以后就改一看,改一下我们叫EP,那这个呢,我们写上叫做student啊好,就是每一个控制器啊,都有自己的这种视图啊,所以呢,我们这里再画过来就可以了,好那么也就意味着它们两个形成了我们MVC架构的两个什么我们组件,那么这里呢,会有多个这样的东西,可是问题恰恰也就来了,你的服务器,你的外部应用有那么多的控制器,有那么多的视图,我怎么知道我当前的用户能够找到其中某一个呢?
07:28
我怎么知道我能找到其中某一个呢?有这么多。啊,同学们想想我该怎么办,你有没有发现这个跟我们之前讲过什么很像,是不是跟我们之前讲的那个叫做分布式有很像,有那么多的服务器,我怎么知道我发一个请求,我去哪个服务器呢?我怎么办?是不是我会加一个我们叫做什么负载均衡器,对不对啊,我们先讲的是负载均衡器,然后我们才讲的是那个什么是不注册中心呢,对不对,那我们这里呢,就应该有个东西,有个什么呢?有一个我们叫做调度中心啊,但这个调度中心呢,我们说这么理解也可以啊,但是呢,它称之为叫前端控制器。
08:11
记住啊,就是我们所有的架构的器都大同小异啊,都大同小异,这个呢,我们写上叫front,叫front controller,叫前端控制器,这个前端控制器的作用是什么呢?很简单,它的作用就是做我们的关联映射,这个映射是什么意思?给大家举个例子啊来。大家看啊,叫front controller,那么这里就又写上什么东西呢?叫我们UR啊,写个叫做斜杠UR,你这么写完以后,它会自动怎么办呢?它会自动到我们的UC里面去,所谓的UC呢,UC呢就是user controller啊,那同样道理,这里写上我们叫EP,那这个emp呢,就是我们的ec啊,那么这个呢,我们叫做什么呢?叫student,那么就我们去掉什么呢?叫做,哎,就这意思,所以啊,也就意味着把我的用户的一个请求路径跟我当前的某一个控制做了一个关联映射,那其实这个就是我们很多集群当中会这么做的,所以啊,这样的话,诶,我们这边就过来了,然后呢,他也就过来了啊好。
09:10
然后呢,我们这边来拿过来,拿过来以后,那么同学们想想,这个时候我的用户他要想走我们优的话,他该怎么办。我明确告诉你了,我的这个用户的控制器必须发一个叫U的,那就意味着你的用户如果想访问的话怎么办?那是不是应该发一个U的过来啊,诶所以记住这就有要求了,有规范在里面了,可不是说你想怎么做就怎么做了,我应该发一个什么呢?U,你发一个U的过来以后,我的front controller他一看,哦,你要想访问的是UC呀,那行了,我的UC那就走这了,走这以后就完成它跳出页面就完事了,那如果你访问的不是U,你访问的student,你只要发一个叫S,它就会走这儿,那这样的话就实现了我们的一个功能,一个调度的功能啊,所以啊,这个我们称之为叫前端控制器啊,前端控制器这个叫做业务控制器,就是说处理业务的啊,这个呢是用来做映射调度的啊,那么所以啊,它是非常重要的,它不光是重要,而且我们的MVC架构模式当中,MVC啊架构模式咱们叫架构模式啊,咱们的模式中它要求要求什么呢。
10:20
要求他必须用某一种类型的程序来实现啊,要求我们的前端啊,前端控制器,它必须采用特殊类型的啊,特殊类型的程序实现,那这时候我们就得大概了解一下我们外部当中都有哪些我们的类型了,比方说咱们刚才就看到了一个叫listener。还有一个叫field,还有一个叫so啊,这是我们做外部开发经常会碰见的不同类型的,这个我们的什么类啊,就这样,那么我们这里啊,他说了必须采用特殊类型的程序实现,那这是三种不同的类型,我们要采用哪一种呢来实现呢?首先我们就考考虑考虑就这个它呀,就这个东西它能不能用我的listener来实现。
11:08
它能不能用我们的listener来实现这个功能啊,那首先咱们说了什么叫监听器啊,是当什么什么发生的时候怎么怎么做吧,可是我们这可没这个概念,我们我们这里就是个映射关系吧,它起到了一个调度性的作用。你来了以后,你不知道去哪,我帮你去调度,诶是干这个事情用的,而不是说你发生什么事,我还怎么怎么做,不是这样的,所以这个我们是不会用的,那好了,那fer呢。Filter行不行,Fielder我们称之为叫过滤器啊,它是做一个筛选过滤的一种操作,那么我们这拿它行不行呢?原则上是不可以的,但是其实是不是也可以啊,为什么呢?你来了以后,我做一个筛选过滤,看看你优点跟哪个相等嘛,对不对也可以,但是记住我们不太好,为什么,因为我们的什么当前叫调度期,是你来了之后你该去哪,你可能不知道,你迷路了,我帮你指条路,就这意思,但field什么意思叫筛选过滤,就表示的是我对你的请求,叫做拦截,拦截以后要判断你对还是不对的啊,而就说我看你是否合法,你合法让你通过,你不合法不让你通过,但我们这儿没这个概念,没有这种筛选过滤的概念,所以这两个也是不行的,他两个不行的话,那就只剩下什么了,So类,所以我们架构模式当中,它就要求必须什么呢?采用特殊类型,这个类型就是叫so类,必须有so类时间,不能用别的时间由。
12:40
别的实现就不叫MVC架构啊,就是这么个意思啊,所以呢,这个咱们大概的了解一下,那么所以我回过头来我们会发现这个就是我们那个前端的什吧控制器,咱们称之为叫dispa,叫调度,它就叫调度的意思,那么这个sol就是一个调度器,一个前端控制器,跟咱们前面讲的那个分布式那个负载均衡器和那个注册中心非常的类似啊,然后呢,接下来下面呢是我们的什么,诶我们上下文的参数啊,有个叫初始化参数,初始化参数当中,它这里面也会有一个参数名叫contact conig location啊也这个东西,然后呢,它里面也是class pass,然后呢,里面有个叫spring spring当中有一个叫spring VC的contest,这个文件恰恰在我刚才拷贝的里面,它也有这个文件,跟它指的是一样的,而上面这个地方呢,是spring横线,恰恰呢是他啊,所以啊,这是两个不同的配置文件,你读你的,我读我的,咱们俩呢不是一回事儿,只不过咱们底层的。
13:40
逻辑都一样,但是我们俩从框架的角度来讲是两回事啊,所以给它分别的集成就行了,那么分别集成以后,我们刚才恰恰提到了一个叫filterer的概念,所以我们这里呢,还要增加一个叫做什么呢?叫filter,这个filterer呢,咱们拷贝过来啊,咱们叫过滤器,嗯。给它放过来啊,放过来以后我们放在这儿啊,咱们写上,嗯,咱们叫做过滤器,咱们叫过滤器啊好把这个呢给它放过来,放过来以后这个过滤器你们应该是一定要熟悉的,叫字符编码过滤器,因为在网络当中,其实我们大数据呢,可能对于那个网络还稍微差一些,为什么呢,都已经封装好了啊,系统和系统之间的数据交互呢,都是已经封装好的那些RPC那些东西,但是对于我们外部来讲,那我们就需要关心网络中的数据交互了,你关心网络数据交互恰恰有可能会导致乱码出现啊,所以我们这里呢,要考虑支付编码的问题,那所以你会发现它增加一个过滤器以后,对我的用户请求进行拦截,拦截之后来设定它的什么字符编码叫UTF杠八啊,就这么个意思,你加上以后不会出现乱码,还是非常不错的啊,好了,那我现在呢,就把这三个我们给它提成好了啊,一个是listener,一个field,还有一个我们的啊。
14:59
好了,那这个咱们做完了以后啊,那基本上我们现在已经集成了两个框架了,一个是spring,一个spring spring VC,但是你光集成了不行,我得知道怎么集成的,所以我接下来呢,把咱们这个配置文件稍微的给大家描述一下,咱们讲一讲,所以我们的spring框架咱们先看一看。
15:18
这里呢是我们的啊,那么这个spring的话,我们打开我们的spring,所以打开打开配置文件就在这个位置,这个位置当中,你会首先发现一个这个东西叫扫描注解类,这什么意思呢。这是因为啊,我们spring它是一个基础框架,基础框架要去什么呢?创建对象,并且组合对象的关系,对吗?那好了,你要创建对象,你的对象在哪呢?哪些对象我需要被管理的,我不知道对不对,我不知道,所以啊,我需要看一看哪些类要被我管理,哪些类不需要被我管理,那我需要加个标记,这个标记我们称之为什么呢?叫注解。啊,咱们那个注解就是加标记,我们恰恰在之前的项目当中,咱们是不是给大家演示注解吧,还自己写注解了吧,其实就是加个标记,反射的时候呢,去找那个什么注解,Spring框架底层就是那么做的啊,你加上一个注解之后,它运行的时候去反射,去找那个注解,找到了你就是我要管理的,就这么个意思啊,所以这里面扫描注解类,它里面就有一个这个东西叫组件扫描啊,叫主面扫扫描,这个扫描啊,有那么多的类,我不可能全扫一遍,不可能,所以呢,他这边有个叫base package啊,一个基包,就是说基础的那个包啊,从这个包里面去扫描,那我这里面会有个叫com点什么爱的硅谷吧,点星什么意思啊,就是我的包名是以它开头了吧,那所以呢,我在这里呢,就创建一下,咱们叫做new啊创建。
16:48
我们叫com点啊我们的艾特硅谷,然后呢,我们CT,我们点web就可以了,所以点击OK,点完OK以后这边呢,就不会标红了啊好了,那然后呢,接下来那你扫描的话,有那么多的类,到底扫描什么样的类呢?它这里面说了我们呀,除了这个不扫描以外,我们spring当中的注解呢,我都扫描。
17:09
我这个不扫描叫排除啊,把什么排出去了叫ctrler,为什么要把ctler可以给它排出去呢?这个恰恰就是我刚才跟大家说的,我们数据来了之后,先走哪个框架啊,先走的是我们MVC框架,对不对?MVC框架他走完了是不是才到我们的什么东西啊,Spring吧,哎,到这儿,所以说数据到这到这以后它就应该被调度了吧,所以这个我们称之为什么东西啊,叫controller,就这地方是我们的controller,那所以controller应该被谁读取啊,被MVC读取,我们的service应该被谁读取啊,应该被我们spring,因为做业务的嘛,对不对啊,就这个意思,所以说我们的这个spring是不应该读取这个controller的,应该由另外一个外部的spring VC框架它来读取,所以我们这里呢,就把它排除掉了啊,把它排除排除以后别的注解呢,我们可以去扫描一下,嗯,然后接下来这是什么东西啊,这个叫data source数据源对吧,然后有个叫C3P0啊,C3P0有个。
18:10
连接词在里面啊,然后呢,这个我看看啊,这个我这好像还不太对,因为这个应该是180808啊,是我本地的啊,好,然后别的呢,应该都是正确的啊好接下来下面呢是集成买bety的框架,你既然建立连接时,你的目的就是为了去查询数据库,那查询数据库的话,恰恰跟我们的买bety框架有关系,那么买Betty框架跟我的web没有直接的关系,所以呢,他不需要在web点叉L里面去做集成,他不需要,他只需要干嘛呢,只需要在spring里面做提成就可以了,所以我们这里单独的来提成买bety的框架,那这里呢,它就会有标红的信息,这个标红呢就告诉你了,它有个叫con location的什么位置,配置文件的位置,那这个位置当中又加了一个叫class,有个叫买斯,有个叫con,哎,那这个呢,我们事先也给大家准备了一下,谁来在我这个位置有一个叫买斯,所以拷贝。
19:10
拷配之后把它放到这里面去啊,这都事先准备好的,你们都不用管它啊好了,那么这里面就有个叫confi,这个confi呢,打开这个配置文件是买白的核心配置文件里面会有一些基础的配置参数,我这里是空的,就全采用默认值了啊,然后呢,把这个关掉之后,咱们再往下看,那么下面呢,就要data source,这个就表示的是我的买要用到这个连接词啊source了,嗯。还有呢,接着往下,下面呢,这个叫map location是什么意思呀,Map叫映射吧,Location位置吧,叫映射的位置吧,说的简单点,我们的买白是为了让我们操作方便,它会把大量的那些什么大量的一些数据库的操作呢都封装好,但是有些东西它是不能封装的,为什么?因为它封装以后我们改起来就不方便啊,而且效率呢,可能没那么高。
20:04
说的就是那个蛇纹。如果他在底层把蛇口纹自动封装好了,你想维护就不容易了,为什么?因为他写死了嘛,那你写死的情况下肯定是不方便呢,所以在这种情况下,它会把那个circle文呢放在配置文件当中,那这样的话你想改就非常容易改啊,所以它会有一个map的location,这个map我们称之为叫映射文件啊,这个map叫映射,那么circle就叫circle映射了,所以他就告诉你了,我们要在class pass下面有个MY,有个叫map,诶我的恰恰就有一个叫map,这个叫call,这个call叫通话日志啊,就这么个意思,然后打开,打开以后它里面就会有一些信息,这个咱们还没有给大家讲过,所以这个先咱们先放到这儿,咱们后面再说啊,所以这个呢,咱们先放到这儿就可以了啊,有个叫MY,有个叫map横线,诶,他恰恰就满足要求了,但是有的同学啊,可能在学的时候呢,会有疑问说老师呀,为什么你上面这个class pass不加星了,而我这去。
21:06
那就行了。就是很奇怪啊,你都是想从拉帕上面去找我们的程序,去找我的文件,但是你的这个地方是不加星的,你这需要加个星,他们有什么区别呢?这里给大家介绍一下,我们的这个区别就在于,如果你不加星的话,它只在当前的class pass下面是有效的,也就意味着它会从我的这个resource下面去找,从我们的什么Java里面去找,它别的地方就不会去找了。但是如果你加个星的话是什么意思呢?它表述的是我的价包里面有配置文件,他也会去找。什么意思呀,我们的那个叫做webf,下面是不是有一个叫library叫Li呀,Li虽然是不是会放很多的假包,那么架包里面有这个配置文件,他也能够给他读取到,但是你不加星就读不到,诶那为什么会这么做呢?我不需要呀,那是因为在我们ma问的开发环境当中,举个例子啊,咱们举个例子,比方说我的外邦,我用到了什么啊,缓存了。
22:10
我用到缓存了,同学们想想,那我是不是应该依赖于它呀?那我依赖的是这个项目还是这个项目所打的架包,是不是我的外B要依赖于他打的架包啊,那么他我要依赖于他打的架包,那假设突然呢,在它里面,大家同学们看在我们这个里面啊,我们看看咱们这里面有没有数据库的操作有没有,有吧,那我能不能在这个项目当中把这些我们的什么配置文,把这些深库文写在一个配置文件里面,可以吧,因为我这本来就社口文,我为了防止程序的库什么,它这个地方耦合性太强了,我把这个社口文写在配置文件当中,那我就可以放这个项目里,对不对?可是你放在这个项目当中,大家想一想,那你打完包之后,你的那个配置文件是不是就在这个价包里面了,那这样的话,记住你的配置文件就在这个价包当中,那这个时候你想读就读不到了啊,在我刚才的地方呢,你想读就根本读不到了,为什么?因为它是不走的,那你要加上星就没事了。
23:10
你加上星以后,即使这个架包里面有配置文件,只要符合你的要求,它都能够读得到,这就是他们的区别啊,一个是我们的当前class pass,一个是当前pass在加所有架包的里面,每个价包里面的class pass我也能够找得到啊,就这么个概念啊,好了,这个咱们说到这以后,咱们再往下看,下面呢是我们的买他要扫描一些类了,因为哪些是跟数据库打交道的,我需要知道,那么这里面它有要求啊,Com点爱硅谷点big data CT web到我这个地方跟他的结构好像不太一样,那不太一样的话,我就稍微的给他改一改啊,那所以呢,我这里呢是com爱硅谷CT.web那这里我再创建一个我们的door吧,嗯。创建一个道啊,咱们面向接口编程,那这里呢,我们写上不对,应该是创建我们的那个new package啊,咱们给他一个道,嗯,好了,你创建完成以后,那么我们点击new,我创建一个Java class,我们写上叫号,我们叫做到。
24:11
啊,专门是跟通话日志相关的那个道,我想想咱们还是这么写吧,咱们叫colo吧,嗯,然后把它改成我们的interface啊点击它,所以呀,我把这个呢拷贝就意味着呀,我把这个包下面的所有接口呢,给它扫描出来,扫描出来以后跟我的买做一个关联,就可以找到我对应的那个数据库的表了,啊所以啊,我们这里呢,有个包的概念啊,叫base package,嗯,好了,这里呢,我们给它加个文字说明吧,啊来,咱们写上,咱们叫扫描,我们倒接口啊,咱们叫倒接口用于啊和我们的MY集成啊,咱们叫MYT啊做集成,咱们叫进行集成吧。好了啊啊行了,那这个写完之后,我们这块呢,就告一段落了,买白就有了,接下来咱们再往下看,下面是什么东西啊,下面就叫a op了啊,下面就叫A了,那么我们前面大家想这什么东西啊,这个其实就所谓的叫IOC吧。
25:18
这就叫我们的IOC啊,IOC能明白什么意思吗?相信你们不明白,因为我刚才说过了,我们的IC是不是创建对象以及组合对象的关系啊,那所以这个是不是等同于创建对象啊,什么意思啊,他是不是叫扫描对象,他扫描对象目的是为了创建对象,没错吧,然后呢,Data是不是也是为了创建数据源,我们的这个叫做创建工厂类吧,这个是不是创建我们的配置呀,所以它都是用来创建对象的,但是你再往这看,这边是不是还有叫呀,什么意思叫叫参照引用吧,那是不是叫组合对象的关系啊?所以我们的spring当中有个核心功能叫IOC,它指的其实就是创建对象以及组合对象之间的关系,它的核心它就在这儿了,但是你的功能我想扩展,那他就做不到了,那那所以这个时候就要用a up来实现它的功能了。
26:19
啊,这是我们的另外一个框架啊,其实啊,我们spring它其实有很多,呃,不同的插件,不同的组件,比方说跟你们大数据相关的spring也有很多,最起码有个叫spring的卡夫卡啊,Spring的卡夫卡说它是一个特别好的什么呢?操作卡夫卡的一个什么框架特别的好,为什么呢?因为咱们之前用的卡夫卡是不是独立的空独立的大数据框架啊,但是很多的功能都得自己来写,但是spring就把它封装了一下啊,封装了以后用起来就更加的简单啊,还是非常不错的啊,所以啊,这个呢,我们了解一下,把spring呢也说一下,嗯,那么这个里面我们叫a op,说白了就是我们什么叫扩展对象的功能,你以前没这个功能,但是我想给你扩展一下,你就具备了这样的功能,所以啊,这个是非常好的,那么我们在这里是把什么样的功能给它扩展了呢,就叫受。
27:13
咱们把那个叫manager啊给它加上,加上了以后呢,把我们当前的service增加了事务处理的功能,以前service就是用来做业务逻辑的,但是我现在把事物给你加进来了,那么就等同于你的service拥有了事物的处理功能,等同于扩展功能啊,这就是我们a op实现的,那么a op的底层靠的就是我们的动态的代理啊动态代理,那么我们动态代理呢,有一个是我们JDK的动态代理,是面向接口的动态代理啊,他是这么做的,所以啊我们这里呢,它就采用了类似的这种方式啊,那么这里呢,它分了这么几步,第一步呢是我们的transaction manager,后面呢,还有一个我们的什么呢?这个东西这个地方有一个叫做切入点啊切入点,然后呢,我们这边呢,还有个叫a op功能增强器,那这又是什么呢?这个表述的是有那么多的类,哪些类你才需要扩展功能呢?那这个时候我们要增加一个条件,增加个约束。
28:14
啊,类太多了,我不可能给每个类都增加我们的什么我们的功能,所以我这里就限制一下,限制什么呢?给我们的com.I的硅谷当中的service增加功能,别的我不增加啊,什么controller啊到啊跟我没关系,我不增加那个事物,我只对service,我增加事物,这是一种约束啊,这约束,那这个都约束完了以后,为什么我这边还要加一个叫功能增强器呢?那是因为我们的事物在我们的数据库当中,它有个隔离级别的概念,有印象吗?就是因为我们的事物在访问的时候是不会出现冲突啊,啊会出现冲突,你也访问,我也访问,这不属于多线程的访问吗?那么你也访问,我也访问的话,那我的数据呢,就可能出现冲突,那为了避免这种冲突呢?我们的数据库增加了我们的事物啊,增加了我的事物,那么这个事物呢,会有个隔离级别的概念,所谓的隔离级别呢,就是说我们两个之间。
29:14
你做了什么操作,我才能看到你的数据啊,或者说我们什么都不做,我也能看到你的数据,这就是我们的一个级别的概念,那么在我们这里呢,咱们就要对它做一个详细的控制,也就意味着做一个力度更细的一个控制,所以这边有它这个就是我们的隔离级别啊,隔离级别这边还有一个叫事物的传播行为啊,传播行为一个叫隔离级别,还有这个叫我们叫回滚策略啊,咱们称之为叫回滚策略。好了,那这个呢,咱们简单说一下啊,既然碰见他了,这个有的时候啊,在Java当中啊,面试事务的还是非常多的啊,我不知道你们这边,因为我们的这个大数据框架,这个事务不是没有,但是特别的少,你像咱们那个什么呀,里面不就有transaction嘛,对吧,也有那个东西啊,那么我们在这边呢,它有一个事物的叫传播行为,这什么意思呢?这里呢,给大家稍微的介绍一下啊,就了解一下这个东西,嗯呃,咱们举个例子啊,举个什么例子呢?比方说我刚才说过了,我们现在呢,给所有的service中的方法呀,要增加什么呢?我们的事物,那我就举个例子,比方说这是我们的叉叉service。
30:22
啊,叉叉,Service,然后呢,我现在这个地方呢,我要做一个什么呢?做一个我们的,诶做一个什么呢?做一个我们的,嗯,Insert,咱们叫insert date,然后呢,我下面呢,再做一个delete啊,再做一个我们的delete啊,咱们叫做delete date,好了,那我就问问同学们,咱们说了给service增加事物,那这个ser的方法需不需要加事物?需要啊对吧,那我的delete呢也需要对不对,可是呀,业务变了,业务怎么变了呢?他说了我的业务呢,是隐射的数据的时候呢,我要先删除,我要再我再增加。
31:01
我要先删除,我再增加,那是不是意味着我可能会在我的方法当中怎么办?我会先调用我的delete date吧,对不对,我会先调用它,可是你调用它这个方法恰恰是这个方法吧,那好,你这个方法要事物,难道他就不要事物了吗?是不是?所以这个就有问题了,什么呢?你们两个事物用的是不是同一个事物啊,所以大家看你的这个地方我需要事物,而这个它呢也需要事物,但是呢,恰恰你们两个形成了一种嵌套,那就意味着你的这个事物它会不会传进来啊,传进来这个就叫传播的意思,叫事物的传播行为,你的事物给不给里面的这个东西,如果给什么意思,就是你有事物,那我就用你的事物,这个我们称之为什么东西啊,叫啊,你有我就用你的,但你要没有呢?你没有,那我也要创建个新的,我得有事物啊,哎,就这意思,你没有我就自己创建一个,你有我就用你的,哎,就这意思。还有另外一种情况,什么情况呢?你这地方有事物,但是我不想跟你有关系,我不用你的,我不用你的话,我每一回怎么办,我都自己创建个新的,每一回我都自己创一个新的new new出来啊,就这样,那么这样的话,当我做完了我的事务处理之后,才该你做,那么它就是一,它就是二,当二做完了以后,这个一才会继续往下执行,这种方式称之为叫require的new,叫每一次都是新的的意思。所以啊,咱们传播行为呢,是在我们嵌套使用方法的时候才会出现的,那这个呢,我们有的时候需要考虑,到底两个方法需不需要在同一个事物当中,不需要诶,我们就要考虑如何创建一个新的,那如果需要的话,那么如何传递这个事物,哎,这是要考虑的啊,所以这个呢,我们也了解一下。
32:50
好了,然后呢,我们再回过头来看这个东西,这个是我们的叫隔离级别,那么我们的隔离级别解决的是我们数据库访问的问题,在我们数据库访问当中啊,经常会出现什么呢?经常会出现这个东西,我们写上啊,咱们叫做什么呢?叫脏读,咱们这个东西啊,我们叫做脏读还是什么东西啊,我们的叫不可重复啊,咱们叫不可啊,咱们叫重复读啊还有一个叫什么呢?叫换读吧,诶叫咱们叫换读,嗯。
33:21
呃,这个叫换读啊,就这个东西,那么我们的隔离级别呢?恰恰什么呢?它会解决这样的问题,什么叫脏读,你如果把脏读的含义搞明白了,那就好办了啊,什么意思啊,是别人去增加的数据,你看到了吧,可这个数据别人怎么了,还没提交,他没提交的数据被你看见了,可是这个数据恰恰可能在一会儿当中怎么了,被回滚了,回滚了,回滚以后这个数据就没了,但你恰恰拿到了一个可能根本就不存在的数据,这就叫张数据,咱们称之为叫张读,你读取了一条脏数据,就这个意思啊,为什么呢?你拿到了,可数据库又不存在啊,就这么个概念,那这个叫不可重复读,什么意思?
34:06
这个不可重突什么意思啊?它表述的是你查询了两次一模一样的数据,但是发现两次的查询的结果却不一样,举个例子,我查一个张三,我写个ID等于一,我查一个张三,可是呢,我再过了一会儿呢,我还查ID等于一的这个数据,你发现不是张三了,变成什么了?变李四了,这就叫不可重复读,你读取的数据它不可重复,为什么呢?两次不一样,那为什么两次不一样啊,是因为在你第一次读取和第二次读取中间,有人把这个数据给它改了,对吗?并且提交了啊,改完了以后还提交了,那这样的话,你的数据可不就是什么呢?不能重复了吗?所以这个是不对的,为什么我我第一回读,我的目的是为了在后面做一些统计啊,做一些别的操作呀,可是你改了的话,我还怎么做统计,我还怎么做分析,那肯定是不对的,所以我们必须保证我第一回读和第二回读的结果应该是一致的,否则是有问题的,那么在这种情况下。
35:06
就有一个什么东西啊,是不是叫可重复读取的那个叫隔离级别呀,还有这么个东西啊,这个满蛇口,满蛇口恰恰它默认的隔离级别,就这个东西啊,买蛇口的隔离级别恰恰能解决它啊,然后呢,这个张组这个问题啊,是那个Oracle。Oracle数据库它的隔离级别呢,恰恰是什么可以解决脏读,为什么呢叫读已提交,已提交的那个读的数据呢,可以在我们这个Oracle里面这个个默认个体级别啊,那什么叫换读啊,什么叫换读啊,换读表述的是当我们去什么呢?统计的时候吧,比方说我统计统计啊,我们这一年的流水,那我把整个表的数据给他读出来了,读完了以后准备做统计的时候发现怎么了,又多了一条。过了一会儿,又多了一条。那就意味着什么,我们的这个换读就导致什么东西啊,我现在统计的数据什么呢?不对,为什么呢,一会儿多一条,一会儿多一条,一会多一条,什么原因呢?说明别人是不是又插入了新的数据啊,又插入新的诶那为什么买SQL解决不了呢?你这里不是不可重复读吗?也就是说我们这样可以重复读对不对,那是因为你的买时候解决这个什么不可重复读的问题呢?是给数据什么加锁。
36:26
他给数据加锁啊,他给数据加锁啊,他加了锁以后,那这个数据加锁之后,别人改不了了,当然就没事儿了,可是他这个锁呢,叫什么呢,叫行级锁。这个叫行几说什么叫行机锁呀,你查询几行给几行家说,我查询十行给十行家说,那老师啊,那如果这么写呢,我写个叫做星,我写上叫什么东西啊,我这什么意思啊,星from什思啊,不叫全标,记住不叫全标,而是把我当前查询出来的所有数据加锁吧,比方说你现在有100条,我是对100条家说吧,但是这个表我可没说上。
37:12
我这个表是没锁的,我只是把当前查询的结果锁上吧,那么这个时候记住它还能不能增加数据,能吧,所以说行级所只对我查询的行家锁,但这个表是没锁的,这个表还可以增加数据,那么恰恰就会导致什么换读,那换读哎,就这意思,所以这个换读要想什么呢?要想解决就得给这个表加锁了,叫表级锁,这个叫行级锁,还有个叫表级锁啊,就是这样,所以啊加锁的方式它不一样,那么说到这儿以后,这个行级锁我们还还要告诉大家一下,我们的买S扣当中一般是怎么写的,一般这么写的,其实他也不会那么写,因为买时候本来默认就是那个什么行机锁,但是我们用这种方式也能叫行机锁,什么意思啊,查询数据的目的是为了什么?为了更新,你为了更新这些数据就全给我锁上啊,全给我锁上,那么这种锁定方式我们称之为另外一个称呼,叫非观锁。
38:11
叫悲观所啊,就这意思。那么说到悲观所了,你们马上应该能够想到另外一件事情,叫乐观所。乐观所靠什么方案解决的?靠的是那个叫version吧,对不对,靠那个版本号啊,版本号的一个比对来实现的这个操作啊,所以这个版本号其实我在很多的地方都会用得上啊,都会用得上,举个例子,比方说那个叫g UC Java的那个线程高级吧,Java的线程高级GUC当中就会有这个什么呢?乐观锁的概念,为什么呢?因为它涉及到一个什么呢?叫原子性问题,叫原子性问题,原子性问题它就可以靠我们的乐观所来循环便利,来比对内存中的数据,来达到我们的原子性,靠的这个东西有一个这个算法,这个算法呢,叫什么呢?叫CS算法。
39:06
对吧,有个叫CS算法是吧,叫compare,所以对不对,交换嘛,对不对啊,就这意思,但是CS算法呢,会导致一个问题出现,叫ABA。叫ABA问题啊,会导致这么一个问题出现啊,所以啊这些呢,都跟我们的乐观所有一定的关系啊,所以啊,这个呢,我们大概都知道啊,这样原子性啊,什么ZUC啊,什么CS不都知道嘛,对不对啊,ABA呢是我们CS导致的一个问题啊好了,这个呢,我们说一下之后呢,我们接着呢往下来看啊,就是我们当前我们的配置文件,咱们说到这了,接下来是我们的这个叫for,什么意思啊,它表述的是我们的回滚策略吧,那你会发现我们的这边是什么东西啊,叫Java点点exception,也就意味着当前我们的spring框架,它的那个回滚的时候是发生异常就回滚,那事物嘛,你的为了保证数据的有效性的或者回滚吗?
40:03
但是告诉你,我们spring的默认回滚策略波是他。默认的回滚策略是什么呢?是那个叫运行期异常,运行期异常它会回滚,编译异常是不会回滚的,他不回滚啊,为什么呢?因为他认为编译期异常是你事先应该知道的,你事先应该知道的话,你就应该事先做处理,我就不管了啊,就这意思,那什么时候我要管呢?是你意想不到的情况,意想不到的异常,那么就是我们的运行提异常,运行其异常就是我意想不到的运行期异常有哪些异常。哪些异常是我们运行提异常。最简单的是不是空指针异常啊,在运行过程当中,我怎么知道它会什么呢?报控帧的,我觉得不会报啊,诶这是我意想不到的,那既然你都想不到,那框架就为了保证数据的什么一致性,还有什么安全,我就给他回滚一下,所以这是我们spring它做到的,那什么样的异常它不稳呢?我刚才说过了,叫做编译起异常,哪些异常是编译起的IO except not放except对不对,还有什么circle exception吧,哎,这些都是包括,诶咱们之前咱们咱们有一个异常啊,这个异常叫做name space not found exception啊,Not放这个异常大家想想它是我们编译题的还是我们的运行题的啊,点一下,点完以后大家看有这个东西叫什么do not IO是吧,然后点,点完以后base IO,然后再选什么东西IO,那也就意味着最终是不是到了IO这个位置了,那么肯定是我的。
41:46
编一起长吧,编起长,你们能分清什么叫编译期,什么叫运期吗?啊,好吧,那个行,大家先休息一下,咱们下节课接着讲啊。
我来说两句