快速上手Spring AOP切面编程(有实践内容!快速掌握!!)

2023-12-26 14:44:28

AOP简介

不惊动原始设计的基础上为其做功能的增强,不做代码入侵(不改变原来的函数内容就增强这个函数的功能)。

用大白话说就是A,B,C 三个方法,其中A,B方法都需要加某一个功能D(方法),那么就把这个功能D(方法)抽取出来,单独作为一个功能。

其中A,B,C方法就叫做AOP概念中的连接点

A,B方法,叫做切入点(就是哪些方法要追加功能)

而你抽取出来的这个功能D就叫通知

通知与切入点需要进行连接,连接通知D和方法A,B的叫做切面 ,切面描述的是通知与切入点的关系。

所谓面向切面编程,说的切面,就是指这个切面。

由于Java中一个方法不能独立存在,所以这个D方法存在的类,就叫通知类

AOP概念总结

在这里插入图片描述

入门案例(快速上手)

下载,密码f8tf

https://pan.baidu.com/s/1HueArdpn-sjyAI_11hrqaQ?pwd=f8tf

下载后用IDEA打开,执行App类
如果出现这里爆红

在这里插入图片描述

点击
在这里插入图片描述
然后,把App设置为启动类即可。

在这里插入图片描述

现在运行APP,先执行update方法,见控制台输出
在这里插入图片描述

通过查看BookDaoImpl类可知,一个有显示时间的方法,一个没有。

在这里插入图片描述

我们现在的任务是,在无代码侵入的情况下,给update这个方法加上输出当前时间的功能。

实现AOP的具体做法如下

  1. 导入坐标(pom.xml)
  2. 制作连接点方法(原始操作,Dao接口与实现类)
  3. 制作共性功能(通知类与通知)
  4. 定义切入点
  5. 绑定切入点与通知关系(切面)

先完成第一步导入坐标

导入坐标

这里如果你今后想不起来如何导入,其实直接百度就行
在这里插入图片描述

在pom.xml中导入如下坐标

    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.4</version>
    </dependency>

制作连接点方法

在这里插入图片描述
连接点:其实在Java里,一个方法就是一个连接点,这里我已经在代码里为大家写好了,这里说的连接点就是BookDaoImpl类下的save(),update()方法,所以大家可以直接进入下一步,制作共性功能。

制作共性功能

这一步是重点

制作共性功能首先要创建通知类

创建通知类

首先要在主包,也就是com.itheima下面建立一个包叫aop,然后创建一个类,我们以MyAdvice为类名(这里这个类名你可以任意取,类命名规范即可,就是一个通知类,我们一会儿要写通知在里面)

为了让MyAdvice类被Spring管理,我们需要加一个@Component注解

在这里插入图片描述

由于使用AOP编程有两种方式,xml与注解,我们这里使用开发中最常用的注解方式进行演示,注解方式需要给MyAdvice前面加上@Aspect注解

在这里插入图片描述

但是单单加上这个注解还不够,我们还需要通知Spring,我们要进行AOP切面编程,Spring在识别这个@Aspect注解前,还需要一个注解加载Spring配置上,使Spring支持aop的注解开发,即可以开始识别类上的,@Aspect这个注解了。

给SpringConfig加上@EnableAspectJAutoProxy注解。

在这里插入图片描述
创建完通知类后,我们自然要写通知在里面。

还记得什么是通知吗?

在这里插入图片描述

定义通知

通知,通知要写到通知类里

定义通知的方式如下

    public void method(){
        System.out.println(System.currentTimeMillis());
    }

通知其实就是一个方法,我们这样就把通知定义好啦!!

这个通知的功能就是输出当前时间。

在这里插入图片描述

还记得切入点是什么吗? 切入点就是你要去增强哪个方法。

我们在定义完通知之后,还需要定义切入点,接下来我们看如何定义切入点。

定义切入点

切入点:即我们要增强哪个方法。

想想我们的任务:

我们现在的任务是,在无代码侵入的情况下,给update这个方法加上输出当前时间的功能。

所以切入点就是这个update方法。

声明一个切入点的方法是这样的

    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}

在这里插入图片描述

也许你会对这种定义方式毫无头绪,接下来我来慢慢解释。

@PointCut是表示定义切入点的一个注解,有了这个注解,我们就可以声明一个方法,来代表我们的切入点。

记住,切入点定义依托一个不具有实际意义的方法进行,即无参数,无返回值,方法体无实际逻辑。

也就是这里的pt()方法

execution意味执行,其实这里就是表示,你要让pt这个方法,具体表示哪个方法呢?

显然我们要表示的是update方法,而我们知道,方法是可以重载的,单单依靠update这个方法名,在一个类下,无法确定唯一的方法。

只有

  1. 方法名
  2. 参数
  3. 返回值

三者才能在类下确定唯一的一个方法,所以我们首先要在execution里写的就是
方法的返回值 void

其次我们要说明要增强的这个方法位于哪个包,哪个类下,并且参数情况是什么样的。

这样最终就写成了我们看到的这样的形式

在这里插入图片描述

相比看到这里大家对定义切入点以及定义通知有了清晰的认识。

这还不够,切入点和通知还没有进行绑定,接下来我们看如何绑定切入点和通知。

绑定切入点与通知

这一步很简单。

我们只需要在通知前面加上注解,告诉这个通知,具体要应用于哪个切入点就可以了!

    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }

至于你想让这个通知方法在切入点前执行还是切入点后执行,你可以通过@Before或@After来进行控制,我们以@Before为例演示。

在这里插入图片描述

需要注意的是这里你在绑定的时候需要把方法名连带()一起写上。

试试看!

目前,我们已经增强了update方法,在App类里调用看一下吧!!

在这里插入图片描述

哈哈哈,怎么样,你已经初步掌握了如何使用AOP来进行对方法的无侵入增强!!

在这里插入图片描述

我们在不对原始代码update更新的基础上就完成了对update方法的增强。

掌握了对AOP使用的第一步,后面就会轻松很多!!

如果你喜欢这篇文章的话,请给我点一个赞吧!非常的感谢!💕

我会尽力后续写出类似这篇文章一样清晰易懂的文章,如果你想看更多我写出的文章,就请关注我吧!!

完整代码

如果你无法顺利完成,可以参照我的完整代码,做出修改。

下载,密码r5xe

https://pan.baidu.com/s/1hmj6b49wICp0zzq4MKaLYA?pwd=r5xe

得到文件夹后使用IDEA打开在这里插入图片描述

文章来源:https://blog.csdn.net/Obscurede/article/details/135166421
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。