spring —— AOP(各类通知)

embedded/2024/10/22 5:11:50/

接:spring —— AOP(前置通知)

前置通知(Before)外,AOP 里面还有返回通知(AfterReturning)异常通知(AfterThrowing)后置通知(After)环绕通知(Around)

一、返回通知 

切面类: 

java">package com.spring.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@EnableAspectJAutoProxy
@Aspect
@Component
public class LogAspect {@AfterReturning(value = "execution(* com.spring.aop.Calculator.*(..))",returning = "result")public void afterReturningMethod(JoinPoint joinPoint, Object result){System.out.println(result);}
}

返回通知相较于前置通知,在 @AfterReturning 注解中增加了 returning 属性,该属性的属性值与 afterReturningMethod 的形参名称保持一致。当目标方法有返回值时,可用于接收目标方法的返回值。

二、异常通知

切面类:

java">package com.spring.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@EnableAspectJAutoProxy
@Aspect
@Component
public class LogAspect {@AfterThrowing(value = "execution(* com.spring.aop.Calculator.*(..))",throwing = "ex")public void afterThrowingMethod(JoinPoint joinPoint, Throwable ex){System.out.println(ex);}
}

异常方法用于当目标方法出现异常时调用,特点是在 @AfterThrowing 注解中增加了 throwing 属性,其属性值与 afterThrowingMethod 方法的形参名称保持一致,用以接收目标方法的异常信息。

三、后置通知

 切面类:

java">package com.spring.aop;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@EnableAspectJAutoProxy
@Aspect
@Component
public class LogAspect {@After(value = "execution(* com.spring.aop.Calculator.*(..))")public void afterThrowingMethod(){System.out.println("after method");}
}

后置通知与前置通知类似。

四、获取目标方法的名称及参数: 

切面类:

java">package com.spring.aop;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;import java.util.Arrays;@EnableAspectJAutoProxy
@Aspect
@Component
public class LogAspect {@Before(value = "execution(* com.spring.aop.Calculator.*(..))")public void beforeMethod(JoinPoint joinPoint){//获取目标方法名称System.out.println(joinPoint.getSignature().getName());//获取目标方法参数System.out.println(Arrays.toString(joinPoint.getArgs()));}
}

五、环绕通知

环绕通知等于是将以上四种通知在 try…catch…finally… 里面进行布置。

切面类:

java">package com.spring.aop;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@EnableAspectJAutoProxy
@Aspect
@Component
public class LogAspect {@Around(value = "execution(* com.spring.aop.Calculator.*(..))")public Object aroundMethod(ProceedingJoinPoint joinPoint){Object result = null;try {System.out.println("前置通知");result = joinPoint.proceed();  //调用目标方法System.out.println("返回通知");}catch (Throwable e){System.out.println("异常通知");e.printStackTrace();}finally {System.out.println("后置通知");}return result;}
}

1、aroundMethod 参数里面使用 ProceedingJoinPoint 类型,然后可以通过 .proceed() 调用目标方法。

2、如果目标方法有返回值,那么 aroundMethod 方法也应该有返回值。


http://www.ppmy.cn/embedded/86743.html

相关文章

2.5 openCv -- 使用 OpenCV 合并(混合)两张图片

目标 在本教程中,您将学习: 什么是线性混合及其用途;如何使用 addWeighted() 函数合并两张图片。理论 注释 下面的解释来自 Richard Szeliski 的书籍《计算机视觉:算法与应用》。 从我们之前的教程中,我们已经了解了一些像素运算符。一个有趣的二元(双输入)运算符是线…

如何将Python应用容器化到Docker中

将Python应用容器化到Docker中是一个常见且有用的做法,它可以帮助你轻松地在不同的环境中部署和运行你的应用,无需担心环境差异带来的问题。以下是编写Dockerfile以容器化Python应用的基本过程: 1. 准备你的Python应用 首先,确保…

secureCRT同时在所有已打开窗口执行命令、mac-os下使用的SecureCRT版本 以及 SecureCRT一段时间不操作没有响应的问题

一、secureCRT命令行工具一次性同时在所有已打开窗口执行命令 公司的服务器比较多,最近因为opcache,上线发布后,需要重启所有的WEB服务器上的php。目前使用的jenkins发布,不过账号安全问题,给jenkins的账号权限受限不能…

《javaEE篇》--单例模式详解

目录 单例模式 饿汉模式 懒汉模式 懒汉模式(优化) 指令重排序 总结 单例模式 单例模式属于一种设计模式,设计模式就好比是一种固定代码套路类似于棋谱,是由前人总结并且记录下来我们可以直接使用的代码设计思路。 单例模式就是,在有…

PHP基础语法-Part2

if-else语句、switch语句 与其他语言相同 循环结构 for循环while循环do-while循环foreach循环,搭配数组使用 foreach ($age as $avlue) //只输出值 {xxx; } foreach ($age as $key > $avlue) //键和值都输出 {xxx; }foreach ($age as $key >…

重生之我当程序猿外包

第一章 个人介绍与收入历程 我出生于1999年,在大四下学期进入了一家互联网公司实习。当时的实习工资是3500元,公司还提供住宿。作为一名实习生,这个工资足够支付生活开销,每个月还能给父母转1000元,自己留2500元用来吃…

《昇思25天学习打卡营第19天|基于MobileNetv2的垃圾分类》

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写(Python语言)&a…

【九大高校联合支持,学生易中,已确认ISSN号,见刊检索有保障!】2024年电力电子与电气工程国际学术会议(P3E 2024,8月23-25)

随着科技的不断进步和社会的发展,电气工程在各个领域都发挥着重要作用,它涉及到了电力系统、电子技术、自动控制等多个方面。近年来,人工智能、大数据、云计算等技术也不断更迭,使得电气工程也更加注重智能化、数字化的发展以及结…