00:00
各位,在刚才的内容中呢,我们完成了a op底层原理的讲解,那下面呢,咱就通过一段代码来把动态代理来具体写一下,咱就用。有接口情况,完成一个JDK的动态代理,这么一个代码编写,那我们下面再来写一下,我写到这个位置,那来实现AOC,它这个顶形原理轴,咱们做一个。JDK的动态代理,把这个代码我们来就完成,那这个我们要怎么做,给各位写一下啊,就是现在如果说我们要使用这个。JDK的动态代理。那这个过程中呢,咱就需要使用一个类里边的方法来创建你接口实验类的代理对象,然后使用一个什么类,这个名字叫做pro。使用这个process类里边的这个方法来创建出我们这个代理对象,这是一个描述,那这个类咱通过API文档我们来看一下。
01:13
我这里边把这个JDK8的文档已经打开了,然后咱找个包,在这个Java浪包里边有个类,这类的名字就叫per,就是它在这个类中有方法能提出我们创建代理对象。然后把这个给各位截过来,在Java long包中有个per这个类。然后在这个类中呢,有一个方法,咱们找一下这个方法咱往下看。大家看它里边的方法中,这个方法大家看啊,叫new process,然后咱看这方法写到它返回指定接口的什么代理类的实例,就是咱说的接口实验类的代理对象,所以咱们现在用这个方法就可以。
02:04
完成JDK动态代理这么一个代码,然后把这个方法给各位分过来,咱用的就是这个方法,然后这个方法我们来看一下啊,我写到这位置。就这个方法,在我们这个pro里边的方法,咱就调这个叫new pro。Instance。方法来实现我们里边这个具体功能啊T。然后这个方法咱们仔细看啊,这个方法中在文档中写到里边,大家看是不是有三个参数,那三个参数是什么意思,给各位先来做个解释,然后咱们一会儿用代码做个实现。我写的位置就下一个内容啊,这里写到这方法里边有三个参数,那三个参数是什么,咱看一下,首先我们看第一个参数。
03:02
这是什么呢?大家看啊,这个参数描述叫class load,这是什么?就是你这个类加载器啊,就得到你当前这个类加载器,这是第一个参数,然后咱看第二个参数。第二个参数是什么呢?看这个。它叫interface,然后这是一个类,就是class这么一个类型,然后这个参数是什么呢?就是现在比如说因为咱们用的是JDK的源代理,它是针对有接口情况,也就是说你增强类所在那个接口,这里边写接口的class,而这个接口可以有多个接口啊,这是我们的第二个参数,我写一下,就是你增强方法所在内的那个类。这个类实现的那个接口,这里边指的就是接口,它支持多个接口,就你可以写多个,因为你看是一种数组形式,第二个参数,然后里边有第三个参数,第三个什么呢?注意啊,这参数最重要,它叫做invocation handler,这指的是什么呢?就是咱们现在要增强一个类中的方法。
04:15
在这里边就写你增强的部分,而这个叫vocation handle,咱打开它是个什么,是一个interface,所以咱一块就是写个类实现这个接口,然后在里边写你的增强的这个逻辑,然后把这个给各位写一下,第三个参数就是咱们要实现里边的这个。接口,这接口叫invocation handle。然后这里边我们就是创建你的这个代理的这么一个对象,然后我们写我们增强的那部分,就是你新加的一个部分,所以这样的话,咱们把这参数给各位做了一个说明,然后再总结一遍,咱们下面就来写这个代码。
05:01
在这过程中,因为咱要做一个JDK的动态代理,那怎么做?在里面有个类叫proceed proceed里面有个方法叫new proceed ten,用这个方法能串出接口之间类的代理对象,而这方法因为它是一个静态的,咱们可以直接调用在方法中三个参数,第一个参数是这个类加载器,第二个是你这个接口这个部分。它支持多个第三个,这一个叫evocation handler,就是我们写增强的那个部分,所以这样的话,咱们把这方法我们就说完了,然后说完之后咱们下面就开始把这个代码,我们继续来做实验,我写一下第二部分就来实验一下这个JDK。动态。代理这个代码,把这个代码我们来做一个具体的编写,那咱们下面的来写一下啊,咱看怎么来做。首先啊,在这里边呢,因为咱们现在是一个新的部分,所以我现在就把这项目咱再重新复制一份。
06:05
然后这个项目改个名字,我们叫5DEMO4。复制之后,咱们把这个项目给它打开。在我们E盘里边这个work目录中。有一个supreme demo4把它打开,然后打开之后在里边咱就写一下这个JDK的动态代理代码啊,等他先打开,然后把他的名字给他先改一下。DEMO5。这样的话,这个就写出来了,然后写完之后,我把里面这个。相关的包先给它删掉,然后咱们重新来写。这个啊,基本项目结构我们就弄出来了,这个名字改一下啊。DEMO4啊,应该是DEMO4啊,不是DEMO。
07:01
代四,然后这样的话呢,咱们把这个写完之后,下面呢,在里边咱开始写这个具体代码,那怎么做,按照咱的结构,我这里啊,每一步给各位在笔中都描述一下,首先第一部分咱们就先创建一个interface这么一个接口,在里面可以定义这么几个方法。这是第一步,然后第二步咱们创建这个接口的实现类,在里边实现它那几个方法,所以咱先把这两步先做到写个interface,写方法,然后写它的实验类,那我来写一下啊,第一个写个interface,比如我起个名字又叫user。Bo啊,Interface,然后在里边,比如现在我就写上这么两个基本的方法。我们来一个啊,比如第一个public,让它来一个返回值,假如返回值我就来一个类型啊,假如我们做一个相加的一个操作啊,写这个,然后在相加里边,咱们传两个参数,就是一个A一个B在这位置,最终蕊吞这个A加上B,这样的话,咱们把这方法给它做了一个编写啊,就是这么一个啊,这接口里边,它里面是定义啊,也是咱实验内容来写啊。
08:19
先写这么一个方法,然后选完之后,比如下面我再来一个方法,然后这个方法我就直接来一个word,比如叫这个。Update。啊,包括里边,比如说我也可以给他,比如写一个参数啊,比如咱来一个缀这个ID。所以这样的话呢,咱现在就写了两个基本的方法,这些方法也来个反义词,来一个string。第一个啊,在接口中定义出来了,然后定义之后呢,咱下面在它这里边建个实现类,然后实现类中把两方法做一个基本的一个实现。那我们来写一下啊。咱们创建一个直线内。
09:04
U do。MKL让实现类实现这个接口右侧Du,然后在里边把它的方法做个实现,就是里边两方法,然后两方法比来一个返回值,第一个就反应这个A。加B第二个反应,这个给这个ID啊,这个啊,我们就写了一个基本的实验类。把这个就做到了,所以各位啊,把这过程快速做出来啊,这没有什么难点啊,就是串一个interface,然后里边定义方法,在这实验类把方法做个实现。然后这个写完之后,咱下面做的是咱的重点,因为我们现在要做的功能是什么,通过动态代理方式,把我里边的A的方法,还有阿的方法里面的功能做个增强,就是给他加一个新的一些逻辑,咱需要做这个过程,那怎么做给各位来写一下,因为咱要做一个增强的这么一个地方。
10:04
那咱们来实现啊。就下面我们写第三部分,咱就开始。使用这个P这个类来创建一个接口的代理对象,就是做这个增强的过程,那怎么做,给各位来实验一下,首先在里边呢,比如说我先写个类,我就叫JDK。Per。就JDK的代理啊,然后在这里边,比如现在我们这个位置,就给他写一这么一个问方法。然后在问法中呢,咱肯定要做件事情,创建你那个接口,实现类的这个代理对象是吧,创建,那怎么创建,咱刚才刚说过,在里面有一个类叫per。然后proceed里面有个方法叫new instance,用这个咱是不是就可以做到,所以现在我们就这么来实现,用它把这个功能给它做到,那咱就把它写下啊,咱们看怎么来做。
11:08
这里啊,我来做个实践。就是它的做法就是呢,咱现在加一个叫per。注意别导错包啊,Java long包中的里边这个方法叫new instance,然后在里边有三个参数,咱看啊,第一个是类加载器,比如就写它的类加载器。咱来一个这个啊,就是点上class,点上get class第一个,第二个是那个你要实现的接口,但是它接口是一个class,一个数组类型,比如叫这个interface。然后里边我们有它那个接口,咱们现在要拆的接口是这个u Du,所以加上它的class,这是里边的第二个参数,叫这个interface,然后里边还有第三个参数,第三个参数咱看到叫invocation handler,但是这个参数咱看到是个什么。
12:07
是不是一个接口啊,那咱们这该怎么做?我强调啊,有多种写法,第一种写法咱可以直接上,这个叫invocation handler。写个什么,就写一个匿名内不类,这么做完全可以,但你还可以怎么做,咱们单独写个类,让这个类实现这个接口,然后里边new那个类,那个对象是不是也可以啊,就是都可以做到,这叫匿名内部类,或者你直接写个类来实现接口都可以,那我现在我就不这么做了啊,我就直接咱们写一个类给它做到你这么写更加清晰。啊,这个我先。注释掉啊,咱再复制一份。然后把这个我先去掉啊,第三个我就先不这么做,咱们写个类,然后把这做到啊,那我们看怎么来做啊。给各位写一下这个我先注释啊,就是咱给他完整出来,然后下面做法就是什么,我在这位置就创建你那个代理的那个对象的这个代码,那做法就是咱们起个类,比如这个类我给它起个名字,我就叫这个。
13:14
User。DAO。Policy,然后这个类呢,实现咱刚才那个接口叫invocation handler,把这个做实现。然后实现接口之后,我们需要实现接口里边这个方法,它里面有个方法,就这个方法叫以work方法。这方法什么意思呢?就是现在只要我这个对象已创建,那里边这个方法就会被调用,这些方法中咱就写我们那个增强那个逻辑,就是你增强的部分。增强的逻辑写到这个与倭寇中这个啊,是我们这么一个结构,然后这个写完之后啊,这个逻辑咱一块写啊,然后现在把这个位置先改过来,在这里边呢,咱写什么,就写这个叫user Du process代理编就这对象,然后它就能返回我们这个代理对象啊,所以现在是这么一个基本结构。
14:10
然后结构咱看一遍,把这个我给头最终完成,做法就是咱们有个Bo的interface,有它的实验类,然后要综合这个方法,那用里边这个new ten,里边三个参数,第一个类加载器,第二个你的接口class,第三个咱们这个invo handle,我是专写一个类,然后在里边,然后把这个溜出来就可以了,这样的话咱把它就做到了。但是做的过程中呢,给大家强调,因为咱们现在想要增强的是你这个就是u Du。MPL这里边的方法想把这个方法自我增强,所以咱们现在呢,你就要创建也是他的一个代理对象,所以我们现在需要把这对象是不是要给它传到咱这里边来,因为传之后才能把你之前的逻辑执行,然后再加上新逻辑。
15:04
什么意思呢?因为之前里边,比如说往里添加。是不是可以给他返回A加B的值啊,比如我现在想在A加B之前做个操作,想在A加B之后做操作,但是A加B这个方法是不是要执行,就是他之前的功能还要做到,所以咱需要把这对象传到咱们这个代理的对象中来,所以才能实现,所以里边啊需要做件事情。我写一下啊,做法就是。打我们那个就是。创建的那个就创建说的痛点,创建的是谁的那个代理对象,把那个谁给他需要传递过来。不知道各位是否能听懂啊,因为咱们见的是user do PL是不是它的代理对象,所以你需要把它给它传过来,那怎么传呢?多种方式,咱现在实际中有一种比较简单的方式,通过一个有参构造进行传递啊,有参数的构造进行传递,这种方式用的很多,那我下面写下啊,比如现在我这里边就来一个九三构造public。
16:14
叫这个u Du。Policy。然后在里边呢,传入你那个对象,因为咱的对象是user Du PL,你就把这个传回来就可以了,但现在呢,咱为了写的就是更加通用一点,这里边不写它了,这个什么。可不可以来一个object啊,比如叫这个OG,通过object传递,这样的话更通用,但你直接写这个UDOL也可以,我在上面啊,也来个属性叫object。OBG,下面写一个这点,OBG等于咱们传过来的这个OBG这个对象,这就是通过有参构造把你那个对象传过来,因为咱要创建他的一个代理对象。
17:03
这各位要明确啊,把这传递通过永恒构造,咱写的通用点就写一个叫object,然后这个选完之后,咱下面做的就是在以work方法中写它那个增强的逻辑,这里我强调啊,什么叫增强逻辑?因为咱们现在比如说我想要增强里边那个A的方法,想增强这个RV的方法,那你A的方法,RV的方法,它是不是要执行啊,比如咱在他之前,包括之后要做这个操作啊,所以咱们要做这个事情。然后写一下啊,就这里边,比如现在我在那个方法之前做一个处理,然后在方法之后。我也想做一个处理,然后中间是你那个。被增强的那个方法,它需要执行,比如咱增强A的方法,增强RV的方法,那这些方法肯定要执行,所以现在我们是这么来做,那比如说在方法之前的这个位置,我就做个输出啊,然后输入一下,我就写一下,说这个是在方法。
18:09
之前执行。之前执行,然后在执行中呢,咱给他也输入几个值,比如说我取个值,大家看啊,在这个以work方法中呢,有三个参数,第一个proceed就是你代理对象,第二个叫method,表示你当前的一个方法,第三个lgs是你的参数,比如现在我通过method可以得到一个值。Get name。这什么意思啊,就是你当前的方法执行是哪个方法,可以把方法名字给它输入出来,然后这里边比如说我们现在再输一个值。就是现在我想输出我们传递的那个参数。因为咱们刚才提到传递参数呢,就是里边这个ARGS,咱把它做输出,因为它一个数组嘛,咱之前写过,我来一个叫瑞点。
19:05
To string把这个咱们做个输出,所以这句话,比如咱们可以在方法之前执行,然后方法之前执行,之后咱方法是要执行,就是你里边的A的方法,Update的方法都需要执行,那怎么做method就义的方法,在method里边有一个方法叫EVO。这个我要知道啊,已work,然后在语里边两个部分,第一个是你的那个对象,第二个是我们的参数,而咱的对象目前就是这个OBD,因为它已经传过来了。第二个参数叫args,这样的话把它可以执行,这句话就表示只有你当前这个方法啊,比如这里边有反应值,我们叫res。这个啊执行,然后执行之后,咱这个方法执行之后呢,里面有个值,这值最终我可以给它做一个返回,也就是你的方法吞A加B,把A加B值返回,包括方法之后咱们也做输出。
20:05
写下啊,就是你的里边的方法。之后。执行。然后执行里边我们也可以做个输出,比如就把这个OBD做输出,就是你当前这个对象做个输出,所以这样的话,咱现在把这个我们就写出来了,就是在这过程中我强调啊。咱们这个代理对象做法就是先把你代理是谁的对象,把那谁传过来,因为咱是u Du I PL代理对象,所以把它用有恒构造传过来,然后穿完之后在一后方里边,咱做这个增强逻辑,我现在做法就是。在方法之前之后做这个输出。这是之前,这是之后,这是执行我们那个被增强方法,用method点以work传对象,还有你的参数把这做到,所以这样的话,咱现在就完成了这个过程,然后完成之后呢,在里边咱最后把这个代码给的最终写完。
21:05
那怎么写大家看啊,你看现在我这是在问方法中,然后在里边呢,有这么几个参数,这位置你看现在报错了,因为我是有参构造,你需要把你对象传过来,那这对象我在外边咱就扭一下啊。MPL,比如叫user Du,等于U上一个这个MPL,然后把这个user Du给它传过来,因为里边要传入你的对象,传完之后这部分会返回我们那个。那个代理对象啊,代理对象咱给他做一个强转,因为它是我们接口就是这个u Du。啊,这么一个接口。比如交这个Du,这里边我们给它做一个强转,这句话就类似于我们之前写那个user Du Du等于new上一个接口实现类,咱之前是因为现在是代理对象,它不是扭出来,用per这里边的方法把这对象创建出来,接口等于实现类的代理对象,这样的话做到了,然后做到之后咱们最后调一下这个方法,比如咱就调里边这个A的方法,里边传两个值,比如一个一,一个二。
22:20
啊,两个参数,然后这个方法会有一个返回值,返回值咱也可以给它做一个输出,就这个比如叫result啊。Result,咱们把它做一个输出。所以这样的话,咱就完成了里边这个JDK的动态代理,它里边就是这么来做啊,这个咱们就写出来了,然后咱再看一遍啊,最终咱做个测试,做法就是用pro里边的new pro instance创建接口,实现类的代理对象,因为这是接口,这是它的对象,只是这个过程不是new,是用多元代理串出来的,然后再调用,在过程中主要是写的这个代码。
23:03
我们直接实现这个叫evocation handler,在里边传入你这个被代理的对象,然后在这个有方法中写你的增强逻辑,我现在是在方法之前之后做一段输出,包括这是你的具体方法,所以现在把这个我们就做出来了,包括这个啊,咱为了明显我在方法里边也做过输出,所以咱看得更清楚啊,我写一下就是。A的方法。执行了啊,包括下面一样,给咱写一个叫update的方法。执行了。所以现在把这个JDK的动态代理我们就写完了,写完之后最后咱做个测试,因为它就是一个问方法,咱直接来测试一下啊,看一下最终的结果是什么样的。咱们看最终效果。各位来看啊,在这里边我们发现它的成语就是第一个方法之前执行A的是不是你的方法名字,就是咱们写的这个方法名字,然后这个ADS是是你的参数,然后这时A的方法执行了,在方法之后执行了,是把我们这个对象输出了,然后最后是这个结果,结果咱刚才在这里边是做了输出,所以这样的话把这个就做到了啊,这是我们写的增强类中的方法,用JDK的方式把这个完成。
24:27
但这里边有几个细节,各位给他完善一下,我就大概说一下比较简单了,你看我现在啊,比如说我这么做的话。这里边它会。比如说你调的是A的方法,它会执行A的方法,你调的是update的方法,它会增强update的方法,那我现在其实可以在这位置啊,我做过判断,什么判断呢?如果是A的方法,咱做一些处理,如果是RV的方法,我再做另外的处理。那怎么判断?觉得各位应该能想到啊,大家看这个my third.get name得到是方法名字,那咱根据方法名字可以做判断,假如这个值是A,咱就做A的处理,假如它是update,是不是可以做update处理,但是它的总体结构就是咱们写的。
25:13
这么一个结构,所以现在啊,咱就完成了,用JDK的这种方式实现了动态代理增强内中的方法,把这过程我们就最终写出来了。所以各位啊,把这代码给他自己动手去写一写,虽然说这是一个底层的代码,咱后面用到这个润里边,它里边把这代码经帮我们做了封装,咱直接做配置就可以了,但是要求各位把这代也要给他去写写,因为咱后面再用那个润方式,它最终来进行配置,这样的话啊,咱们就完成了这个代码。这个啊,是我们写的这么一个过程。所以咱们就是到这里为止呢,咱就把这个a op的它的概念,底层原理,包括里边这个具体代码我们就完成了,然后咱们下面就结合spring,通过SW里边通过它的配置文件,包括注解方式来实现a up的配置,现在咱们讲的都是原理,包括它的底层的部分。
我来说两句