Spring——AOP切入点表达式和AOP通知类型

news2024/11/24 10:44:05

 

切入点:要进行增强的方法

切入点表达式:要进行增强的方法的描述式

 第一种方法的本质是基于接口实现的动态代理(jdk)

 

第二种是基于cglib实现的动态代理

AOP切入点表达式

而需要加载多个切入点时,不可能每个切入点都写一个切入点表达式

例子

下面的代理描述的是匹配任意返回值的(第一个*) ,org.example包下的任意包下的任意以service结尾的类或接口下的,以find开头的任意方法,参数任意。

也就是给业务层下的所有查询方法加上AOP,比如findByid,findAll,findBy...

  @Pointcut("execution(* org.example.*.*service.find*(..))")
    public void pts(){}

 

AOP通知类型  

在目标对象中定义两个方法 

在通知类中定义五个方法演示上面五种通知类型

package org.example.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;


@Component
@Aspect
public class MyAdvice {

    /*@Pointcut("execution(void org.example.dao.BookDao.save())")
    public void ptx(){}*/

    @Pointcut("execution(void org.example.dao.BookDao.update())")
    public void pt(){}
    @Pointcut("execution(int org.example.dao.BookDao.select())")
    public void pts(){}

  /*  @Before("pt()")
    public void before(){
        System.out.println("before advice...");
    }*/
  /*  @After("pt()")
    public void after(){
        System.out.println("after advice...");
    }*/
/*    @Around("pts()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("before advice...");
       Object ret= pjp.proceed();
        System.out.println("after advice...");
        return ret;
    }*/

/*    @AfterReturning("pts()")
    public void afterReturning(){
        System.out.println("afterReturning advice...");
    }*/
    @AfterThrowing("pts()")
    public void afterThrowing(){
        System.out.println("afterThrowing advice...");
    }
}

 前置通知:

后置通知: 

 

环绕通知(无返回值):

原始方法的输出直接被吞了

 在这个通知中需要告诉它原始操作需要放在哪个位置,下面的pjp.proceed()表示的就是对原始操作的调用。需要抛出一个异常

@Around("pt()")
    public void around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("before advice...");
        pjp.proceed();
        System.out.println("after advice...");
    }

 环绕通知(有返回值):

使用如图的环绕通知调用一个有返回值的方式时会报错。

 

原因是环绕通知的方法也要有返回值,但是返回值类型应该写Object,因为不能确定所有的原始方法返回值相同。

在下面的环绕通知中,原始方法的reutrn被拦截了,需要这个通知再进行return

 上面这个才是标准写法,不管返回值是不是void

返回后通知:

和上面的后置通知很像,但是这个是在返回之后才通知,如何在返回前有个异常导致没有正常返回就不会执行通知,比如在select()中 

输出如下 

 异常后通知:

只会在抛出异常后运行,还是上面的1/0,输出如下

 

 

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

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

相关文章

条件语句(分支语句)——“Python”

各位CSDN的uu们你们好呀,最近总是感觉特别特别忙,但是却又不知道到底干了些什么,好像啥也没有做,还忙得莫名其妙,言归正传,今天,小雅兰的内容还是Python呀,介绍一些顺序结构的知识点…

Hadoop学习:Yarn

1.YARN介绍 一个通用的资源管理系统和调度平台 YARN不分配磁盘,由HDFS分配 相当于一个分布式的操作系统平台,为上层MR等计算程序提供运算所需要的资源(内存、CPU等) 2.YARN三大组件 不要忘记AppMaster,他是程序内部…

Android 进程间通信机制(二) mmap 原理

一. 前言 Binder中一次拷贝的实现就是利用mmap(memory mapping)内存映射机制,我们来看看它的工作原理. 二. 参考文章 下面这几篇文章建议先好好阅读一下,都是总结的很好的文章, 每个人理解可能不一样 笔者也是看了好多博客文章和B站视频讲解, 然后加上自己的理解后 输出的一…

程序的编译和链接

程序的编译和链接程序的编译和链接程序的两种环境翻译环境详解编译和链接预处理编译汇编链接运行环境程序的编译和链接 程序的两种环境 在ANSI C的任何一种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。 …

《数据分析-JiMuReport04》JiMuReport报表设计入门介绍-页面优化

报表设计 2 页面优化 如上图所示的报表,仅仅是展示数据,不过这样看起来似乎太草率了,所以再优化一下吧 保存报表后,在积木报表中就可以看到对应的报表文件 此时我们如果还需要编辑报表,就点击这个报表即可 2.1 居中…

如何设计企业节点的『工业互联网标识解析系统』

一、『星火 链网』体系架构 『星火 链网』以节点形式进行组织互联互通,其中包括三类节点:超级节点、骨干节点、业务节点。 其底层采用“1N”主从链群架构,支持同构和异构区块链接入主链。在全国重点区域部署『星火 链网』超级节点&#…

three.js的demo例子-STL加载对象组件

three.js的demo例子-STL加载对象组件 提示:demo示例中所涉及到的three.js安装插件方法这里就不单个说明了哈,有需要的网上有很多教程 文章目录three.js的demo例子-STL加载对象组件效果展示插件模型一、HTML部分二、script部分1.引入库2.初始化数据3.监听…

卷王都在偷偷准备金三银四了...

年终奖没发; 简历石沉大海; 发消息只读不回 打开某招聘,看了看岗位,这个厂还不错,可是要求好高,我啥都不会。 “哎,算了,我简历还没更新呢,我躺到6月份拿到年终奖再跑…

【动态规划】多重背包问题,分组背包问题

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接 我会一直往里填充内容哒! &…

名创优品业绩狂飙,手握哪些王牌?

撰稿 | 多客 来源 | 贝多财经 2023年注定是名创优品(NYSE:MNSO、HKEX:9896)发展史上具有重要意义的一年,不仅是创立的10周年,也是全球品牌战略升级的开局之年。 2月28日,名创优品公布了2023财年第二财季未经审计财务报告。得益于全球化战略…

机器学习笔记之狄利克雷过程(六)预测任务求解

机器学习笔记之狄利克雷过程——预测任务求解引言回顾:基于狄利克雷过程的预测过程预测任务的求解过程引言 上一节引出了基于狄利克雷过程的预测任务,本节将对该预测任务进行求解。 回顾:基于狄利克雷过程的预测过程 在已知隐变量样本集合…

Windows 环境安装Scala详情

为了进一步学习Spark,必须先学习Scala 编程语言。首先开始Scala 环境搭建。温馨提示:本文是基于Windows 11 安装Scala 2.13.1 版本第一步:确保本机已经正确安装JDK1.8 环境第二步:Scala 官网下载我们所属scala版本文件。Scala 官网…

JavaScript(WebAPI)

目录 1.什么是Web API? 2.DOM和DOM树 3.获取元素 4.事件 5.操作元素 获取/修改元素内容 1.innerText 2. innerHTML 获取/修改元素属性 获取/修改表单元素属性 获取/修改样式属性 1.修改内联样式 2.修改元素应用的CSS类名 6.操作节点 新增节点 删除节点 7.案例…

Vue3的composition API—setup函数, ref函数,reactive函数

1、Setup 函数 1.setup 是vue3中的一个配置项 2、setup是所有组件所需要的数据和方法都需要配置到setup中的 3、setup两种返回值: 若返回一个对象 若返回一个渲染函数 mian.js文件 注意:尽量不与Vue2混用 setup中无法访问vue2中的配置 不能是async函数…

Optional--Java8新特性最佳实践

Optional是在 Java8中引入的新特性之一。使用Optional类包装数据,可以避免经典的空检查和一些try-catch代码块。也能够通过链式方法调用,写出更流畅的函数式编程的代码。另一方面,滥用Optional也会导致性能低下和代码混乱。过往项目业务中有大…

【Linux】旋转锁 | 读写锁

在之前的线程学习中,用到的锁都是挂起等待锁,如果申请不到锁,那就会在锁中等待; 自旋锁则不大相似 文章目录1.自旋锁1.1 概念1.2 接口1.2.1 pthread_spin_init/destroy1.2.2 pthread_spin_lock1.2.3 pthread_spin_unlock2.读写锁…

VIO优化中不客观自由度 (gauge freedom) 的处理 (gauge handle)

文章目录1. 不可观的解释2. 几种不同的gauge handle处理方式2.1. free gauge方式2.2. fix gauge方式2.3. prior gauge方式2.4. g2o tutorial方式3.不同方式的协方差矩阵1. 不可观的解释 这篇论文 中对VIO的4-DOF不可观的定义如下,可以看到这种不可观就是如果对最后…

gerrit操作和jinkens编译合入代码

gerrit 先 查看自己的push 找到后添加reviewer 填写邮箱开头就可以出来 记得1 然后send 让人review 编译不过,gerrit上查看 1.是不是checkstyle问题 2.编译不过,去jinkens查看 先retrigger重新编译 如果发现多次编译失败 则要看下console output 查…

【ONE·Data || 顺序表】

总言 数据结构基础:顺序表模拟实现。    文章目录总言1、顺序表各接口功能实现描述1.1、如何创建一个顺序表?1.2、如何初始化顺序表:SLInit1.3、顺序表的尾插、头插1.3.1、顺序表尾插1.0:SLPushBack1.3.2、顺序表头插1.0&#x…

网络连接的三种模式

文章目录前言一、三种连接模式介绍二、三种网络连接模式的区别前言 在进行虚拟机配置时,网络连接分为三种模式:桥接模式,NAT模式,主机模式 一、三种连接模式介绍 张三、李四、王五在同一个网段,所以他们之间可以相互…