00:00
好,那到此咱们spring中的IOC呢,咱们就讲完了啊,这个IOC呢,大家注意是我们spring中非常非常重要的一个核心,你哪怕咱们学习A的时候,它也是以咱们的IC容器为基础的,OK吧,好,那IOC中我们讲的是基于注解来管理,并还有基于XL来管理B,那这两种方式呢,希望大家都要把它练习的非常的熟练。好,因为咱们之前呢,也跟大家说过,对吧,如果我们现在咱们是把这个第三方类库里面的一些类呢,然后交给咱们的IOC容器来管理,那大家说这个时候你能用注解的方式吗?不能,因为咱们的价包里面放的都是class文件,自解码文件,对吧?然后我们看到的结果也是咱们的a idea反编译之后的结果,这个文件它是只读的,你改不了,那你怎么在当前的类上去加上我们的一个注解注解呢,对不对?所以说这个时候咱们就要用咱们的叉L的方式了,那你像我们平常我们自己创建的类,像咱们的control呀,Service呀,DA对不对,像这些的话,我们就可以用注解加扫描的方式来管理啊,好,所以说呢,大家注意,IOC里面咱们基于叉L和基于注解来管理病的方式,大家都要会啊。
01:15
好,那咱们的IOC学完之后,下面咱们就来看一下咱们的另外一个核心,叫做a op。好,那我们首先呢,咱们AOP呢,咱们需要讲的内容比较多,首先咱们需要先设置一个场景,然后通过这个场景呢,然后咱们引出来我们a up的一个底层实现的方式,叫做代理模式,然后咱们再通过静态代理,然后来体验一下这个代理模式,再通过动态代理呢,然后来给大家展示这个动态代理的效果啊好,然后呢,我们先来看一下咱们的场景模拟,比如说我们现在咱们要去声明一个计算器的接口叫做calculator,然后其中呢,它有加减乘除的方法,非常简单,加减乘除好,然后我们的接口那肯定是没有功能的,咱们需要去创建它的实现类,那我们就可以去创建一个calculator的实现类,来把我们的加减乘除的方法进行实现,很简单,在方法中,咱们只要呢,通过相对应的运算方式,然后把两个参数的这个结果呢算出来,然后再进行返回就行,好,但是我们现在不单要来实现。
02:22
加减乘除的效果,我们还要干什么,我们还要来去创建一个在日志功能的实现类,也就是说我们当前呢,在咱们的实现内中要加入咱们的日志功能,在我们当前咱们的核心操作之前,然后我们需要把咱们当前的这个方法的参数给输出,然后在我们当前咱们运算之后,然后要把我们当前这个运算的结果给输出,OK吧,大家注意啊,然后咱们要做的是这样的一个功能。好,那下面呢,咱们就先把咱们的场景呢给模拟一下,然后首先我们在这咱们再来创建一个新的工程。那我们这里面咱们主要来讲的是咱们的代理模式,所以说咱们叫spring prox y proxy,大家注意这就是代理的意思,知道吧?好,下面com.at硅谷点spring OK啊,先咱们点击finish,那因为这里面咱们目前不需要用到spring中的内容,所以说我们只需要啊,然后来引入一个unit的类库就可以啊,然后是dependency词,然后咱们随便来找到一个工程,然后去把咱们的g unit给复制过来就行啊。
03:34
好,I input changes,然后下面呢,那咱们就把这个接口呢给创建一下,当然大家如果自己创建也行,你不想自己创建的话,咱们直接复制也是可以的啊好,然后是com.at硅谷,然后点spring对吧,然后点大家来看啊,然后咱们在这咱们现在创建一个,比如说咱们要来实现这个代理模式叫prox y。
04:00
啊,然后再往下,然后咱们再来创建这个接口,这个接口咱们叫什么呢?大家来看啊,叫做calculator来,咱们把这个单词给复制过来,这是计算器的意思啊,这是一个接口,然后接口里面都有什么方法呢?咱们直接把这四个方法呢给复制过来就行啊好。行加减乘除,然后下面我们再来创建它的实现类,来创建一个实现类,叫做calculator,叫做calculator I PL来ipl,好,我们需要让他去实现咱们的calculator这个接口,然后重写其中的四个抽象方法,然后我们要做的事情非常简单,大家看啊,就比如说我们现在咱们先把咱们普通的实现类给它写上,然后最后呢,咱们再去加这个日志功能啊好在这咱们怎么做,大家看好,咱们在这呢,来int一个result,结果等于A加上勾,这不是加法运算嘛,对不对?然后我们来说出一句话,这个是咱们的方法内部,哎,方法内部然后冒号方法内部然后逗号result,然后冒号再加上一个result OK啊行,这个大家注意,然后最后呢,咱们把谁给返回,直接把result返回就行。然。
05:21
其他的方法也是一样的,咱们只需要把谁给改一下就可以啊,把咱们当前的这个运算符给改一下就可以啊,好再往下,然后这是乘,然后下面最后一个是除法运算,除法运算是一个斜线啊好,那这是我们当前一个普通的实现类,那我们现在咱们在这个实现类中,咱们实现的功能是不是就是我们最核心的功能,因为我们这里面只只写了什么呀,只写了咱们加减乘除的一些代码,好,那我们现在咱们是要把咱们的日志功能给加上的,那大家说日志功能对于我们当前的实现类来说,它算不算是核心的一些功能啊?
06:00
你看它叫什么,它叫calculator I'p它叫做计算器的时间类,那你的计算器大家说对于我们当前咱们的这个类里面的各个方法来说,哪一些才算是核心操作呀?那咱们计算器的加减乘除操作是不是才算是核心操作啊,对吧,但是我们现在要加入日志功能,我们又没有别的办法,咱们是不是按照正常的思维。那我们是不是就需要在咱们的各个加减乘除的方法中,手动的去添加咱们的日志代码,比如说大家看好我们在这个地方,然后咱们来写个日志啊,写个日志啊,来标志一下它是一个日志信息,对不对?然后再往下,然后咱们的方法名方法,咱们执行的是什么方法,叫做ADDDD方法,大家注意啊,好,然后咱们当前的这个参数是什么?来,咱们把这个A给它加上,然后参数中间用逗号分隔,然后再加上一个勾,大家注意,这就是我们要记录的一个日志信息。
07:01
好,然后下面大家说我在这儿是不是要做一个相同的操作,在咱们实现减方法之减方法的核心操作之前,我们是不是也需要把咱们的什么呢?把咱们当前要执行的方法以及咱们的参数给输出来,在这大家注意也是一样的啊,这个方法是ul方法,然后在这呢,咱们这个方法是div方法,那大家看大家有没有发现一些问题。就比如说咱们现在加入的这个日志操作,大家说一样不一样,一模一样,咱们要实现的功能是一模一样的,把咱们当前要调用的方法的方法名输出,然后把我们当前这个方法的参数给输出,对不对?好,下面呢,我们再来看,比如说我们在它的方法核心代码执行之后,然后我们在这来写一个日志,然后呢,方法同样是ad,在这咱们来写个结果,然后冒号把谁给加上,大家注意,然后把咱们的result给加上,OK。
08:01
那所以说咱们现在做的操作也是一样的,来找到我们当前咱们的减的方法,在这是sub。然后在这呢是ull。好,然后这个地方呢,咱们也是来输出一下,然后这个是咱们的除的方法,然后最终输出的一个结果,OK吧,行,那我们现在咱们的这个实现类咱们也已经写完了,然后大家是不是会发现一些问题,什么问题呢?就是咱们的日志的这个代码,针对于我们当前的方法来说。它是不是有一些多余,咱们从代码,咱们从核心代码的角度来说,它有一些多余,因为我们现在咱们的核心代码跟咱们的非核心代码,它是不是混在一块了,对不对?但是呢,我们现在这个功能我们必须要实现,我们没有别的办法,咱们只能把它给写出来,对吧?那还有什么问题呢?大家想一下,我们能看出来的啊,还有什么问题啊。大家想一下是不是还有就是这个东西啊,它不好封装啊,对不对,为什么不好封装啊。
09:04
大家想我们当前的日志代码是这一行,然后这一行它不像是我们之前咱们需要去封装的一些代码,就比如说咱们的GDBC,大家之前都封装过,因为咱们GDBC它是一段连续执行的代码,对不对?然后咱们只有其中的一些参数,一些数据是不一样的,所以咱们可以把这些数据直接提到咱们方法的参数位置。OK吧,然后把它封装,咱们可以把它封装到咱们的抽象到父类中,然后在父类在它的子类里面直接去调用这个方法实现功能,但是大家看你看现在这东西你能把它封装起来吗?封不了为啥?它是一段连续执行的代码吗?大家看这一行,这一行你怎么封装。大家想一下,你这这东西咱们怎么封装封装不了,因为咱们的面向对象,大家注意它叫做纵向继承机制,然后它只能去封装一段连续执行的代码,而我们现在咱们的日志功能是在我们的这一段代码执行的过程中,对不对,在这有一行,在这儿有一行,那咱们能把它抽象出来吗?
10:10
抽象不了啊,大家注意,所以说这是我们现在遇到的问题,咱们能看到的啊,再给大家说一遍,首先第一个就是咱们的这属于非核心业务代码,核心业务代码就是咱们的加减乘除对不对,但是在我们的核心业务代码里面,是不是就混进来了一些非核心业务代码。是不是好,大家注意这个问题啊。还有呢,就是谁呀,就是我们当前咱们的日志功能,那如果我要想把它给抽出来,对吧,还不好抽,为啥它不是一段连续执行的代码,我们来使用我们学习过的这个面向对象,咱们是抽不出来的,OK吧,行啊好,那下面呢,咱们就来看一下咱们当前写的这个代,写的这一段代码,它的问题是什么,咱们分析一下,然后我们又该如何去解决它呢?OK。
我来说两句