Spring AOP通知类型

news2024/9/23 17:14:47

我们之前的文章介绍了AOP通知描述了抽取的共性功能,根据共性功能抽取的位置不同,最终运行代码时要将其加入到合理的位置。

先来认识一下五种通知的具体类型:

  • 前置通知
  • 后置通知
  • 环绕通知(重点)
  • 返回后通知(了解)
  • 抛出异常后通知(了解)

🍊个🌰:
一张图看懂通知类型

  1. 前置通知: 追加功能到方法执行前,类似于在代码1或者代码2添加内容
  2. 后置通知: 追加功能到方法执行后,不管方法执行的过程中有没有抛出异常都会执行,类似于在代码5添加内容
  3. 返回后通知: 追加功能到方法执行后,只有方法正常执行结束后才进行,类似于在代码3添加内容,如果方法执行抛出异常,返回后通知将不会被添加
  4. 抛出异常后通知: 追加功能到方法抛出异常后,只有方法执行出异常才进行,类似于在代码4添加内容,只有方法抛出异常后才会被添加
  5. 环绕通知: 环绕通知功能比较强大,它可以追加功能到方法执行的前后,这也是比较常用的方式,它可以实现其他四种通知类型的功能。

通知类型总结

@Before

名称@Before
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行

@After

名称@After
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法后运行

@AfterReturning

名称@AfterReturning
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间绑定关系,当前通知方法在原始切入点方法正常执行完毕后执行

@AfterThrowing

名称@AfterThrowing
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间绑定关系,当前通知方法在原始切入点方法运行抛出异常后执行

@Around

名称@Around
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前后运行

环绕通知注意事项

  1. 环绕通知必须依赖形参ProceedingJoinPoint才能实现对原始方法的调用,进而实现原始方法调用前后同时添加通知
  2. 通知中如果未使用ProceedingJoinPoint对原始方法进行调用将跳过原始方法的执行
  3. 对原始方法的调用可以不接收返回值,通知方法设置成void即可,如果接收返回值,最好设定为Object类型
  4. 原始方法的返回值如果是void类型,通知方法的返回值类型可以设置成void,也可以设置成Object
  5. 由于无法预知原始方法运行后是否会抛出异常,因此环绕通知方法必须要处理Throwable异常

🍊个🌰看一下就都知道了:

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void BookDao.update())")
    private void pt(){}
    @Pointcut("execution(int BookDao.select())")
    private void pt2(){}

    //@Before:前置通知,在原始方法运行之前执行
//    @Before("pt()")
    public void before() {
        System.out.println("before advice ...");
    }

    //@After:后置通知,在原始方法运行之后执行
//    @After("pt2()")
    public void after() {
        System.out.println("after advice ...");
    }

    //@Around:环绕通知,在原始方法运行的前后执行
//    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before advice ...");
        //表示对原始操作的调用
        Object ret = pjp.proceed();
        System.out.println("around after advice ...");
        return ret;
    }

//    @Around("pt2()")
    public Object aroundSelect(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("around before advice ...");
        //表示对原始操作的调用
        Integer ret = (Integer) pjp.proceed();
        System.out.println("around after advice ...");
        return ret;
    }

    //@AfterReturning:返回后通知,在原始方法执行完毕后运行,且原始方法执行过程中未出现异常现象
//    @AfterReturning("pt2()")
    public void afterReturning() {
        System.out.println("afterReturning advice ...");
    }

    //@AfterThrowing:抛出异常后通知,在原始方法执行过程中出现异常后运行
    @AfterThrowing("pt2()")
    public void afterThrowing() {
        System.out.println("afterThrowing advice ...");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(4)(4.6) 强制性硬件配置

文章目录 前言 1 ArduPilot操作的简单概述 2 框架类和类型配置 3 电机编号和方向 4 无线电控制校准 5 加速度计校准 6 罗盘校准 7 遥控发射器飞行模式配置 8 电子调速器(ESC)校准 9 配置电机范围(可选) 10 失控保护机制 11 飞行模式 前言 作为首次安装的一部分&am…

深度卷积神经网络DCNN简介

1. 背景 卷积神经网络CNN(Convolutional Neural Network,又称ConvNet)保留了空间信息,因此可以更好地用于图像分类。 卷积操作基于仔细甄选的局部感受野,在多个特征平面共享权值;之后全连接层基于传统的多层…

C++之 多态(Polymorphism)

目录 一、基本概念 多态的使用: 案例一——计算机类 多态的优点: 二、纯虚函数与抽象类 特点: ①无法实例化对象 ②子类必须重写父类中的纯虚函数,否则也属于抽象类 案例二——制作饮品 三、虚析构与纯虚析构 因为父类指…

【C++】结构体嵌套结构体

目录 1、缘起 2、结构体嵌套结构体 3、总结 1、缘起 结构体嵌套结构体 是一种数据组织方式,就像 俄罗斯套娃 一样,一个数据结构可以包含另一个数据结构。这种嵌套结构使得程序可以更加灵活地处理数据,从而更好地满足复杂的需求。类比生活中…

Java之~ Aop自定义注解日志

大纲步骤: 一,创建需要记录的日志表,创建基础方法。(省略) 二,在需要加记录日志的方法上加Aop注解1,创建一个注解类,Aop中定义一个注解import java.lang.annotation.*; /*** http 请…

银行数字化转型导师坚鹏:商业银行零售业务数字化风控

商业银行零售业务数字化风控课程背景: 数字化背景下,很多银行存在以下问题: 不清楚商业银行数字化风控发展现状? 不清楚对公业务数字化风控工作如何开展? 不知道零售业务数字化风控工作如何开展? 课程特…

十三、RNN循环神经网络实战

因为我本人主要课题方向是处理图像的,RNN是基本的序列处理模型,主要应用于自然语言处理,故这里就简单的学习一下,了解为主 一、问题引入 已知以前的天气数据信息,进行预测当天(4-9)是否下雨 日期温度气压是否下雨4-…

拦截器 JWT SpringBoot 多环境开发 本地文件上传 阿里云OSS存储 异常处理

Springboot: 是:由pivotal团队提供的全新框架,其设计目的是用来简化spring应用的初始搭建以及开发过程 作用:简化Spring的环境搭建和代码开发 使用原理:就是boot提前写好了一些maven的工程和jar包,程序员在…

Android屏幕适配dp、px两套解决办法

最新最全文章(2018-08-25):Android dp方式的屏幕适配-原理(后期补充完整讲解)_手机dp输出是横屏还是竖屏_android阿杜的博客-CSDN博客 “又是屏幕适配,这类文章网上不是很多了吗?” 我也很遗憾,确实又是老问题。但本文重点对网上…

ChatGPT来势凶猛,公有云格局会不会大变?

【引言】: AI风暴来袭,全球无人幸免。 但公有云与ChatGPT到底啥关系? 1) 公有云与ChatGPT,到底谁会“吃”掉谁? 【科技明说 | 热点关注】在看到公有云厂商纷纷开始大模型发布,开始GPT的融入之…

虹科教您 | 基于Linux系统的虹科RELY-TSN-KIT套件操作指南(2)——操作演示

RELY-TSN-KIT是首款针对TSN的开箱即用的解决方案,它可以无缝实施确定性以太网网络,并从这些技术复杂性中抽象出用户设备和应用。该套件可评估基于IEEE 802.1AS同步的时间常识的重要性,并借助时间感知整形器来确定性地交付实时流量&#xff0c…

EJBCA搭建

EJBCA搭建 前言: 本次EJBCA搭建使用操作系统为centos 7,shell用户为root。 1.下载jdk环境: // 下载jdk yum install -y java-1.8.0-openjdk-devel // 查看java版本 java -version 本人jdk环境: openjdk version "1.8.…

计算机自动化有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是计算机自动化领域的一些知名SCI期刊: IEEE Transactions on Automation Science and Engineering: 该期刊由IEEE(电气和电子工程师协会)出版,涵盖了自动化科学和工程领域的研究,包括自动控制、人工…

算法记录 | Day35 贪心算法

860.柠檬水找零 思路: 只需要维护三种金额的数量,5,10和20。 有如下三种情况: 情况一:账单是5,直接收下。情况二:账单是10,消耗一个5,增加一个10情况三:账…

九、Locust运行与配置

1. 配置 1.1 环境变量 也可以通过环境变量设置选项。它们通常与命令行参数相同,但大写并带有前缀LOCUST_: 在 Linux/macOS 上: $ LOCUST_LOCUSTFILEcustom_locustfile.py locust在 Windows 上: > set LOCUST_LOCUSTFILEcu…

MySQL的安装与卸载(Centos7.9环境下,全篇图文手把手安装教程)

前言 在安装MySQL之前,我们先来看看MySQL如何卸载。如果从未安装过MySQL的任何版本,可以直接跳过这部分。 如果已经安装过MySQL,一定要确保自己的环境中的MySQL相关文件删除干净,否则重新安装时可能会出现一些错误 tips&#xf…

问界M9全剧透:华为的「科技豪华」样板间

作者 | 德新 编辑 | 王博 今天在nova 11的发布会上,曝了一个意外——问界M9提前剧透。实际上这车要今年四季度才上市。「本来没打算这么早发出来,前阵子网上有一个很老的设计图在传(实在太丑)。没办法,干脆先讲讲」…

DriveGPT、车企订单背后,为什么毫末每年都能搞出新东西?

作者 | 祥威 编辑 | 德新 4月11日,毫末智行正式发布自动驾驶生成式大模型 DriveGPT,中文名 雪湖海若,可以提升自动驾驶认知能力,最终提升规控效率。 雪湖海若的核心,是将各种驾驶场景作为Token输入到模型中&…

《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存分配

目录 PoolSubPage.allocategetNextAvail方法toHandle方法removeFromPool方法 PoolSubPage.allocate 上一篇我们介绍了PoolSubPage的简单知识,当我们需要PoolSubPage的内存时可调用allocate方法查找可分配二进制的位置,具体的源码过程如下: …

ctfshow web入门命令执行web74-118

1.web74 还是先扫目录 payload: c$anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f->__toString()." ");}exit(0); #扫描根目录有什么文件 c$anew DirectoryIterator(glob:///*);foreach($a as $f){echo($f->getFilename()." ");} …