iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一文搞懂SpringAOP的五大通知类型
  • 418
分享到

一文搞懂SpringAOP的五大通知类型

2024-04-02 19:04:59 418人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录一、通知类型二、环境准备添加aop依赖创建目标接口和实现类创建通知类创建spring核心配置类编写运行程序三、添加通知普通通知环绕通知(重点)一、通知类型 Advice 直译为通

一、通知类型

Advice 直译为通知,也有人翻译“增强处理”,共有 5 种类型,如下表所示。

通知类型注解说明
before(前置通知)@Before通知方法在目标方法调用之前执行
after(后置通知)@After通知方法在目标方法返回或异常后调用
after-returning(返回通知)@AfterReturning通知方法会在目标方法返回后调用
after-throwing(异常通知)@AfterThrowing通知方法会在目标方法抛出异常后调用
around(环绕通知)@Around通知方法会将目标方法封装起来

二、环境准备

添加AOP依赖

pom.xml文件里添加Spring AOPAspectJjar包依赖

<dependencies>
    <!--包含Spring AOP:有基本的AOP功能-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <!--AspectJ框架有更强大的AOP功能-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.5</version>
    </dependency>
</dependencies>

创建目标接口和实现类


public interface UserDao {
    public void save();
    public int update();
}

@Repository
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("正在执行 UserDao 的 save 方法");
    }
    @Override
    public int update() {
        System.out.println("正在执行 UserDao 的 update 方法");
        return 1;
    }
}

创建通知类

创建通知类,并指定切入点


@Component//将这个类定义成 Bean
@Aspect//将这个Bean定义为切面
public class MyAdvice {
    //指定UserDao类中的save方法为切入点
    @Pointcut("execution(void com.bighorn.dao.UserDao.save())")
    private void pt1(){}
    //指定UserDao类中的update方法为切入点
    @Pointcut("execution(int com.bighorn.dao.UserDao.update())")
    private void pt2(){}
}

创建Spring核心配置类


@Configuration
@ComponentScan("com.bighorn") //开启注解扫描
@EnableAspectJAutoProxy //开启 AspectJ 的自动代理
public class SprinGConfig {
}

编写运行程序

public class App {
    public static void main(String[] args) throws sqlException {
        //获取配置类初始化容器
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //从容器中获取UserDao对象
        UserDao userDao = context.getBean(UserDao.class);
        //调用userDao的方法
        userDao.save();
    }
}

三、添加通知

普通通知

MyAdvice这个通知类中添加前置通知后置通知返回后通知异常后通知及相关注解。

//前置通知
@Before("pt1()")
public void before() {
    System.out.println("before advice ...");
}
//后置通知
@After("pt1()")
public void after() {
    System.out.println("after advice ...");
}
//返回后通知
@AfterReturning("pt1()")
public void afterReturning() {
    System.out.println("afterReturning advice ...");
}
//异常后通知
@AfterThrowing("pt1()")
public void afterThrowing() {
    System.out.println("afterThrowing advice ...");
}

观察运行App程序后的截图,发现并没有显示异常后通知

手动在save()方法中添加一行代码:int i = 1/0,造成异常后再次运行App。

发现异常后通知有了,但是运行后通知却消失了。

综上所述: 前置通知和后置通知是一定会执行的,而返回后通知是需要在原始方法正常执行后才会被执行,异常后通知是需要原始方法抛出异常才会被执行

环绕通知(重点)

环绕通知是非常强大的通知,能够完成上述四种通知的所有功能。


@Around("pt2()")
public Object around(ProceedingJoinPoint pjp) {
    Object result = null;
    try {
        System.out.println("这是环绕通知中的前置通知......");
        //执行目标方法
        result = pjp.proceed();
        System.out.println("这是环绕通知中的返回通知......");
    } catch (Throwable e) {
        System.out.println("这是环绕通知中的异常通知......");
    }
    System.out.println("这是环绕通知中的后置通知......");
    return result;
}

修改App类,调用UserDao的update()方法,运行程序,观察结果。

public class App {
    public static void main(String[] args) throws SQLException {
        //获取配置类初始化容器
        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //从容器中获取UserDao对象
        UserDao userDao = context.getBean(UserDao.class);
        //调用userDao的update方法
        userDao.update();
    }
}

运行结果如下

注意点

使用环绕通知必须传入形参ProceedingJoinPoint,并使用pjp.proceed()方法实现对原始方法的调用,进而实现原始方法调用前后同时添加通知

通知中如果未使用使用pjp.proceed()方法实现对原始方法的调用,则将跳过原始方法的执行

原始方法的返回值类型决定环绕通知的返回值类型。原始方法若不接收返回值,通知方法的返回值类型可以设置成void,也可以设置成Object;如果接收返回值,最好设定为Object类型

由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须要处理Throwable异常

以上就是一文搞懂Spring AOP的五大通知类型的详细内容,更多关于Spring AOP通知类型的资料请关注编程网其它相关文章!

--结束END--

本文标题: 一文搞懂SpringAOP的五大通知类型

本文链接: https://www.lsjlt.com/news/151759.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一文搞懂SpringAOP的五大通知类型
    目录一、通知类型二、环境准备添加AOP依赖创建目标接口和实现类创建通知类创建Spring核心配置类编写运行程序三、添加通知普通通知环绕通知(重点)一、通知类型 Advice 直译为通...
    99+
    2024-04-02
  • 一文搞懂Redis中String数据类型
    概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redi...
    99+
    2024-04-02
  • 一篇文章带你搞懂Python类的相关知识
    目录一、什么是类二、类的方法三、类的特性四、总结一、什么是类 类(class),作为代码的父亲,可以说它包裹了很多有趣的函数和方法以及变量,下面我们试着简单创建一个吧。 这样就算创...
    99+
    2024-04-02
  • 一文带你搞懂Java中的泛型和通配符
    目录概述泛型介绍和使用泛型类泛型方法类型变量的限定通配符使用无边界通配符通配符上界通配符下界概述 泛型机制在项目中一直都在使用,比如在集合中ArrayList<String, ...
    99+
    2024-04-02
  • 一文搞懂Java中的日期类
    目录一、日期类1.1 第一代日期类1.2 第二代日期类Calendar1.3 第三代日期类一、日期类 在程序的开发中我们经常会遇到日期类型的操作,Java对日期类型的操作提供了很好的...
    99+
    2024-04-02
  • 一文搞懂C++中的四种强制类型转换
    在了解c++的强制类形转换的时候,先看看在c语言中是怎么进行强制类形转换的。 C语言中的强制类形转换分为两种  隐式类型转换 显示类型转换 int ...
    99+
    2024-04-02
  • 一文搞懂Vue2中的组件通信
    目录vue 组件通信方式1.props传参2.emit,on通信3.$ref,$children实例通信4.$parent通信5.插槽通信(一般不用)6.$attr,$listene...
    99+
    2024-04-02
  • 一文搞懂Java创建线程的五种方法
    目录题目描述解题思路代码详解第一种 继承Thread类创建线程第二种:实现Runnable接口创建线程第三种:实现Callable接口,通过FutureTask包装器来创建Threa...
    99+
    2024-04-02
  • 一文让你彻底搞懂AQS(通俗易懂的AQS)
    一文让你彻底搞懂AQS(通俗易懂的AQS) 一、什么是AQS AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Se...
    99+
    2023-09-04
    java 开发语言
  • 一文快速搞懂Redis的几种数据类型方式
    目录Redis简介Redis有几种数据类型Redis的基本指令String(字符串)List(列表)Set(集合)Hash(哈希)Zset(sorted set:有序集合)RedisDesktopManager数据查看工...
    99+
    2024-04-02
  • 浅谈spring aop的五种通知类型
    spring aop通知(advice)分成五类: 前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常。 正常返回通知[After returning advice]...
    99+
    2023-05-30
    spring aop 通知
  • 一篇文章带你搞懂JavaScript的变量与数据类型
    目录前言:温馨提示:变量1.声明2.赋值3.二个语法小细节变量的命名规范为什么需要数据类型?简单数据类型(基本数据类型)数字型字符串型 String什么是数据类型的转换1.转换为字符...
    99+
    2024-04-02
  • 一文搞懂Java顶层类之Object类的使用
    目录概述toString方法方法摘要覆盖重写equals方法方法摘要默认地址比较对象内容比较Objects类概述 java.lang.Object类是Java语言中的根类,即所有类的...
    99+
    2022-11-16
    Java Object类使用 Java Object类
  • 一文搞懂PHP中的抽象类和接口
    目录一.抽象类1.定义2.应用场景3.入门代码4.细节5. 代码分解二.接口1.定义2. 应用场景3.入门代码4.注意细节三.类和接口之间关系一.抽象类 1.定义...
    99+
    2024-04-02
  • 一文带你你搞懂Java的3种IO模型
    目录Java BIOJava NIOJava AIO小结在Java中,一共有三种IO模型,分别是阻塞IO(BIO)、非阻塞IO(NIO)和异步IO(AIO)。 Java BIO J...
    99+
    2023-05-19
    Java 3种IO模型 Java IO模型 Java IO
  • 【C++漂流记】一文搞懂类与对象的封装
    本篇文章主要说明了类与对象中封装的有关知识,包括属性和行为作为整体、访问权限、class与struct的区别、成员属性的私有化,希望这篇文章可以帮助你更好的了解类与对象这方面的知识。 ...
    99+
    2023-09-17
    c++ 前端 开发语言
  • 一文搞懂Java中的抽象类和接口到底是什么
    目录什么是抽象类抽象类在实现多态中的意义接口是什么通过接口实现多态今天让我们继续学习java,看看java中的抽象类和接口到底是什么? 什么是抽象类 我们之前学过什么是类,那么抽象...
    99+
    2024-04-02
  • 一篇文章彻底搞懂Python类属性和方法的调用
    目录一、类、对象概述二、类的定义与使用三、类属性和类方法的调用四、私有成员与公有成员总结Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象...
    99+
    2024-04-02
  • 一文读懂TS 中联合类型和交叉类型各自的含义
    目录一、简单的联合类型二、对象类型的并集和交集三、文氏图四、集合理论五、类型和集合之间的关系六、了解联合类型和交叉类型七、交叉类型的真实示例八、总结九、参考资源联合类型在 TypeS...
    99+
    2022-12-31
    TypeScript 联合类型和交叉类型 TypeScript 交叉类型 TypeScript 联合类型
  • 一文秒懂通过JavaCSV类库读写CSV文件的技巧
    目录一、背景二、开始2.1 添加 Maven 依赖2.2 写文件2.1 读文件总结一、背景 小哈公司最近准备开发一套新的平台,具体什么平台,因为涉密,这里就不透露了。平台在最终的的技...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作