00:00
各位同学大家好,下面呢,我们按照刚才分析的步骤,基于注解实现润中的A功能,那咱们下面来做一下,首先第一步咱们在这个死人6a op的模块中先引入依赖,这个依赖呢,你也可以直接放到负工程里边也可以,我这里边就在这个工里边直接引下了,那我们来写一下啊,除我们最基础的,然后咱们继续来引入,一个叫做A,一个叫spring aspect,那这两依赖我从课件中直接复制一下,一个是a op,一个是aspect。把这两个拿给他,直接拿过来。这就是我们的第一部分,引入相关的依赖。这个位给它直接复制就可以了。然后这步之后,我们的第二部分呢,创建目标资源,那咱们就写一个接口,一个实现类,然后这里边我这么来做,在a op这里边来,为了区分,我重新建个包,然后在包里边重新写我们的功能,这个包因为是注解方式,咱起个名字就叫I notation a up,为了去方便啊,我就叫a no。
01:15
A op。这是我们创建的,因为后面还有配置文件,所以咱们可以再来个包叫叉l a op了,后面操作方便,然后在这个no里边咱们建个接口,实验类还是用刚才这例子,就是计算器的例子,我把这两个部分咱就直接复制过去了,用它进行操作。为了咱们方便啊,然后大家看第一个计算器的这个接口。第二个实现类,现在我们都准备好了,这个目标资源是我们的第二部分,然后下面第三步,第三步呢,咱们建个切面类,里边设置我们的切入点,包括通知类型,那下面我们写第三步。
02:01
我在里边写一下。咱们啊,创建一个类,然后这个类呢,为了方便我们课件中起相同的名字了,就叫log aspect。把这个进行创建,加个注释,就是我们这个切面的这个。把类创建之后呢,咱在类上面呢,需要加上两个注解,第一个注解就叫comment,就是把它交给进行管理,然后第二个需要再加个注解,这个注解叫A,就表示它是一个切面类。我这里加个注释,它是一个切面类,然后component表示在死人的IOC容器中进行管理,这是我们加的这么一个类,然后加上之后咱们下一部分需要建一个损的配置文件,在损配置文件中做一些清换配置,包括咱配置包的扫描规则以及配置aspad j等自动代理。
03:02
那咱们在里边建一个配置文件。我来做个创建啊,叫B点叉L。把这个咱们先创建出来。然后创建之后,在里边我们加上第一部分就是开启那个组件的扫描,但是扫描需要在里边的加上它里边那个相关的约束,那这部分我从课件中咱就直接复制一下啊,然后在这里边注意啊,这个约束中呢,除了咱们之前说那个banst里面还多了一个叫什么A。这个注意啊。我把这个咱就直接拿过来了,这个不需要记,但是各位要给他引入正确,现在这些都有,然后之后我们来写这个相关内容,第一个开启组件的扫描。这个咱们来写一下,因为咱是基于注解做到的嘛,这个肯定要进行这么一个开启。
04:00
那咱们啊,写一下加上commenttest comment,看加上我们包的这个路径啊,那这个包咱就是这个路径,com.at硅谷此文6a opno a op,这是第一部分,开启源扫描,然后这个之后我们还要写第二部分。第二部分做什么呢?给大家说明啊,因为咱们现在是用到这个pad g,所以咱要开启的自动代理功能,为目标对象自动生成代理对象,这个咱要做到,也就是说到通俗点啊,让这个死认识我们这个注解,就这个注解知道它是一个切面类。那这里边我来写一下,把刚才这段话给大家,这里来写一下啊。我们做法就是开启这个AJ,它里边这个自动代理。
05:00
然后为我们的目标对象生成一个代理。并且让斯文中瑞认识你这个注解,知道它这个类是一个切面类啊,咱需要做这个事情,那怎么做写一下啊,用A里边这个叫看这个j auto是自动代理,这样的话就完成了开启自动代理。这是我们配置文件的部分,这单就完成。完成之后,最后呢,我们来到这个切面类中,在里边做什么设置你的切入点,还有我们那个就是通知的类型,比如现在我想在我的方法前面进行执行,包括在方法之后行执行,我想对加的方法执行,想对成的方法执行,咱在里边进行设置,设置切入点和通知类型,这是我们要做的事情,那怎么做?给大家来说明一下啊,这里边涉及到有这么两个知识点,咱们需要详细说一下。
06:05
首先啊,咱们说第一个就是这个叫。通知类型,说一下这个我们该怎么去做。刚才呢,我们讲术语中提到通知类型呢,有以下五种,我这里列举一下啊,前置通知。返回通知还有什么异常通知,另外有里面这个叫做后置通知。除此之外还有一个叫做环绕通知,这是我们说的五种通知类型,那咱们怎么做呢?给大家强调啊,就是你可以这么理解,每种通知类型,咱们要建一个方法,然后在方法上需要添加上一个注解,用这个注解表示你这个通知类型,就是这个方法在什么时间执行,那这里边我们举个具体例子啊,比如说大家看一下,在里边有很多注解来看注解啊,大家看第一个注解叫before。
07:05
看到了这个注解什么意思,它就表示前置通知给各位列到这里啊,一会儿咱们具体进行实现。这叫前置,然后第二个叫返回,返回是什么呢?咱们看这名字应该能看到返回它的通知,我这里给大家写一下啊,它叫做after。Returning,我们写一下这个after returning,这个叫返回通知,这个咱们讲这里。然后第三个叫异常通知,异常通知用的是什么呢?我们写一下啊,它叫做after throwing,这个叫异常通知。除此之外,还有一个叫后置通知,后置什么呢?它就叫after,这个叫后置通知。写下啊,After,这个叫后置通知。
08:02
除此之外,还有最后一个叫环绕,环绕是什么呢?我们写一下环绕通知,它叫做around环绕通知,这是咱说的五种通知类型,各位把这个要特别明确。因为咱们每种类型对应的就是一个注解。那这里边呢,我们先以前置为例,后面这几个咱们一块儿都已经演示,那怎么做,比如现在啊,我在里边呢,我就加上一个方法,这个方法名字随便起,咱为了区分我就叫这个before。Method,这个作为我们前置通知方法,然后你把这注解写到这个方法上,就是这个before代表前通知,然后写完之后大家看里边是报错了,因为你在before里边需要加点内容,加什么内容里边有一个value属性加你的值,这个值里边做什么呢?给大家小,这里边啊有一个Y6属性,然后值里边咱通过这个角切入点表达式来配置你的切入点,就咱要写个表达式配置,你要对哪个方法做这个前置通知,或者说你对哪个方法做返回,做异常,做后置,做环绕,这里边需要写上一个叫切入点表达式,然后执行之后把这配置好之后就可以了。
09:29
这是咱们写到的啊,然后下面我们继续来说第二个内容,就是这个叫切入点表达式。各位先知道这个特点啊,就是你这里边要进行不同通知类型,它对应不同的注解,然后咱们对应不同方法,比如说我这么写,那就表示这个方法作为前置通知,在你调用目标方法之前,它会先静止行。然后这过程中涉及到一个叫切入点表达式,咱们写到这里。
10:00
切入点表达式,那表达式怎么写呢?咱们看一下我的课件里边啊,课件中我这里列出来了有一个表达式的语法,通过语法我们指定你对哪个目标方法进行增强。这里边有语法细节,这咱就不一个读了,咱直接看一个完整的例子,因为这个例子中写的就这些东西,那咱们看我这里边有这么一个例子啊,我把这例子给大家解到一个图里边,咱们详细来解释一下这个例子。说一下它是什么意思啊,我在这图里边给大家。拿过来啊,咱们看一下,首先我们说一下这个例子中啊,它的第一部分叫。这个单词叫execution,这个是一个固定的单词,就是固定的格式,你第一个必须先写这个单词,这是第一部分。然后写完之后怎么做呢?后面加上一个括号啊,那我在这里边写一下啊,第一个固定的单词叫ex。
11:06
Ion加上括号固定格式,然后括号里边我们看啊,它的第一部分大家看这里是不是写了一个叫public public什么意思呢?Public表示叫返问修饰符,然后后面有个int代表你的方法的返回值,那什么意思给大家说明啊,比如说大家看,比如说现在啊,我想对里面这个就是加的方法,就是这个方法。找到比如做一个增强,那大家看它的反修饰符是public,它的返回类型是不是int,所以把这个咱可以写过去,这是它的这两部分,就这里写到的啊,我们看这个部分。就这里。一个public,一个叫int public代表修饰或者权限修饰符,然后这个int代表你的这个返回值,另外这里提到啊,如果说啊,你把这个写成星号,那就表示。
12:03
任意的权限修饰符和返回类型也是任意的,这是我们写到的,比如说现在这里写一下啊这个格式。一个加上你的这个叫。权限,或者说叫访问修饰符,再加上你这个就是增强方法的返回的这个类型。这是我们写到的,当然这里边可以写星号,就代表任意,然后之后我们再来看啊,后面写什么,后面呢,加上这么一个空格,然后加上里边的这个部分。大家看这里。到这里这个位置啊,这是什么意思呢?就表示你方法所在类的那个全类名。而这里边强调,比如你看啊,我现在这个A的方法是不是这个。包名加类名,里边就把这个写上,同样如果你写星号,那就代表任意包名,这里边代表任意包中的任意的类啊加这是我们提到的,然后再往后看,后面有一个叫div,是加上你这个方法名称。
13:17
包括后面有你方法中的参数,同样如果你写星号,那代表你的任意方法,然后这里边如果你写两个点,那代表你的任意参数类型,这是我们看到一个结构,然后把这个补充完整啊,咱们。来到这里边execution访问修饰符,增强方法返回类型,加上你那个增强方法的全路径啊,就是所在类的全路径。然后加上就是你的方法的名称啊,方法的名称,包括再加上就你方法里面那个参数。
14:00
这个是我们一个就是完整的一个结构啊,但是这里边如果你为了方便写星号,那就是任意,如果你不写星号,那只用到你具体的包,具体的类,具体方法,具体的参数。这个是我们提到的啊,另外里面有个细节,比如说啊,我的类的里边呢,写个星号service,那就表示以service结尾的类或者接口,如果你方法写上get星号表示以get开头的方法名字。这是我们看到一个就是切入点表达式,这咱们说到这里,大家把这个就能看懂,然后下面呢,结合我们具体实际,把我们这个写一下,比如我现在啊,就想对这个类中的A的方法做个前置通知,咱就写一下这个切入点表达式,这个该怎么去做,那我来写一下啊,首先加上一个固定的单词,这个。然后加上括号,在括号里边呢,第一部分咱们看啊,它的访问修饰符是不是这个public啊,当然我的方便可以写星号,我就写个public了,写这位置public,然后第二部分它返回类型是int。
15:18
各位看到是不是int public int,然后第三部分加上你那个增强方法所在类的这个全径,就是它的包名加类名,那咱加上啊全路径,那就是这个。我把复制一点。这是加上它的全路径,然后加上全路径之后,后面怎么做呢?咱就加上个点,加上我们的方法名称,比如是A的,那就是它,而这里边如果说你不加A的,比如说你这里边啊,加上一个星号,那就表示这类里边的就是所有的方法,或者叫任意方法,再加个括号,可以加上你的参数类型,比如我是两个int,或者说我加两个点代表任意的参数。
16:11
所以现在我们这么做,就是对public仿修饰符里边类型是在这个类的所有方法,然后它里边做这个前置通知啊,这个就叫切入点表达式,咱们做这个编写。给各位,给他一定要会写。那比如说啊,咱为了学习,咱再给他再多练一下,比如现在要给他稍微改一下啊,我这么来改。把这位置我改成星号什么意思?就表示任意仿修饰符,任意反应类型,然后加上这个啊,比如这个位置呢,咱为了明确我可以加上一个星号是不这个包中所有类所有方中内容啊,或者说我就这么写啊,就是这个类中的所有方法进行实现,所以怎么写都对,看你的习惯啊。总之把这表达式一定要会写,是咱们诗句中可以说是最常用的一种表达式。
17:07
这个啊,咱就以它为例,现在就完成了啊,完成之后咱为了测试,我在里边先做一个简单的输出,后面咱再进一步完善,这个做的叫前置通知,那我输出一下啊。呃,这个输出呢,我从课件中就复制一下,咱们把这个做个输出。这就是它了啊,这里边输出一下啊,当然这里边有什么方法名咱没有写到,咱先做一个简单输出,一会儿在那说明里边这些值该怎么得到。先输出一下前置松之。所以现在这一部分我们就完成了,然后同样的方式,你可以写这个返回异常后置环绕等等,咱们先以它为例,所以到这里啊,我们里边的这个。第三步就完成了,完成之后下面呢,我们进入到最后一步,就完成它最终的测试,咱就给他最后试一下啊,看一下最后的结果怎么样。
18:07
那我来测试啊,我在里边呢,创建一个测试类,咱们就叫T这个up。测试啊,然后测试类中呢,我就加上这么一个方法,来一个单元测试的方法,Public test,这个就是A啊这个方法测试。然后怎么测试呢?跟我们之前应该是类似的啊,就是首先我们还是加载配置文件,然后得到我当前这个对象,就是这个对象得到之后咱们调里边的A的方法,我们一调A的方法,在方法之前它会做一个增强,把这段话会做输出,所以咱们最后测试一下啊,我这里写一下。OB contexttest等于上一个pass加上配置文件并点叉L,然后这就是这个计算这个类。
19:12
得到的这个对象。然后得到之后,最后我们调用里边那个就是A的方法,咱们随便传两个值,比如一个二,一个三。现在就完成了测试代码,最终咱们测试一下啊,试一下最后结果看它是怎么样的啊试一下。然后大家看啊,最后的结果我们发现啊,这里边报了一个错啊,看我是哪里写错的啊,大家看他说现在在这过程中,这个并没有没有定义啊,那应该是我少了东西啊,大家看什么地方写错了啊,因为我现在是基于注解方式做到的,所以你要做的时候呢,你这个类的对象是不是要创建,我刚才写的时候这是接口,这是时间类,但是类的对象没有创建,所以需要在类上边咱们加个注解,我就加个comment,把它创建交给此文经管理啊,刚才忘了写这个了,所以它没有给它加上就可以了。
20:12
然后加上之后我们再重新测试。试一下最后结果。然后大家看啊,效果是出来了,这是咱们核心的那个业务,就是最终方法内部执行这个相加等于五,然后在他之前这个前置通知是不是生效了,证明咱们基于注解方式实现了a op里边的前置通知功能,这是我们演示这么一个基本过程。
我来说两句