SpringBoot AOP使用笔记
作者:裴星宙 发布时间:2023-12-09 13:25:50
1. 启用AOP
a. 在类上添加@Aspect注解
b. 注入该类, 可以使用@Component进行注入到Spring容器中
2. 通过PointCut对象创建切入点
a. 在某个方法使用类似下面的方法进行注入
@Pointcut("execution(* com.sguess.service.IAOPService.*(..))")
private void pointcut() {
}
i. 其中,execution表达式为
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
ii. 注意, pointcut()方法名是后面切入的时候需要使用的
iii. 方法内可以什么也不写, 写了也调不到
iv. 也可以创建多个PointCut,例如再创建一个
@Pointcut("execution(* com.sguess.service.IAOPService.fun1(..))")
private void pointcut2() {
}
这个的方法名就位pointcut2, 方法名不一样.
b. 创建After方法,Before方法
@After(value = "pointcut()")
public void doAfter() {
System.out.println("Do AOP After function 01");
}
i. After方法是指, 在配置了的切入点被执行后, 执行该方法.
ii. value中的pointcut() 是我们前面在创建@Pointcut中的方法名. 也就是说,是通过方法名和切入点进行匹配的.
iii. 这个的方法名可以随便起.
iv. Before方法同理
c. 带Return的After方法,
@AfterReturning(returning = "str", pointcut = "pointcut()")
public void doAfterReturning(String str) throws Exception {
System.out.println("Return value is: " + str);
}
i. AfterReturn是指在被切入的方法执行后, 获取其返回值, 再执行该方法. 注意关键, 这个可以进行操作返回值.
ii. returning = "str",是指, 假设切入方法的返回的值变量名为str
doAfterReturning(String str)方法的参数变量名必须和和returning保持一致, 这里也叫作str. 然后才能在方法体中使用.
iii. pointcut = "pointcut()"同样是指前面声明的pointcut方法名
3. 通过注解, 使用切入点
a. 监听方法参数
@Before("execution(public int com.sguess.service.*(int, int))")
public void beforMethod(JoinPoint point) {
String methodName = point.getSignature().getName();
List<Object> args = Arrays.asList(point.getArgs());
System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args);
}
@After("execution(public int com.sguess.service.*(int, int))")
public void afterMethod(JoinPoint point) {
String methodName = point.getSignature().getName();
List<Object> args = Arrays.asList(point.getArgs());
System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args);
}
4. 执行顺序:
a.Around的方法优先于Before/After执行,After优先于AfterReturn.
i. 代码
@Before("execution(public int com.sguess.service.*.*(int, int))")
public void beforMethod(JoinPoint point) {
System.out.println("Before function");
}
@After("execution(public int com.sguess.service.*.*(int, int))")
public void afterMethod(JoinPoint point) {
System.out.println("After function");
}
@AfterReturning("execution(public int com.sguess.service.*.*(int, int))")
public void afterReturnMethod(JoinPoint point) {
System.out.println("AfterReturn function");
}
@AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e")
public void afterReturningThrowing(JoinPoint point, Exception e) {
System.out.println("AfterReturnThrowing function");
}
@Around("execution(public int com.sguess.service.*.*(int, int))")
public Object aroundMethod(ProceedingJoinPoint pdj) {
System.out.println("Start AroundFunction");
Object result = null;
try {
System.out.println("Around process start");
result = pdj.proceed();
System.out.println("Around process end");
} catch (Throwable e) {
System.out.println("Around process exception");
}
System.out.println("After Around process");
return result;
}
}
执行结果:
Start AroundFunction
Around process start
Before function
Around process end
After Around process
After function
AfterReturn function
5.小结:
@AfterReturning(returning = "str", pointcut = "pointcut()")
public void doAfterReturning(String str) throws Exception {
System.out.println("Return value is: " + str);
}
@Before("execution(public int com.sguess.service.*.*(int, int))")
public void beforMethod(JoinPoint point) {
String methodName = point.getSignature().getName();
List<Object> args = Arrays.asList(point.getArgs());
System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args);
}
@After("execution(public int com.sguess.service.*.*(int, int))")
public void afterMethod(JoinPoint point) {
String methodName = point.getSignature().getName();
List<Object> args = Arrays.asList(point.getArgs());
System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args);
}
@AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e")
public void afterReturningThrowing(JoinPoint point, Exception e) {
String methodName = point.getSignature().getName();
List<Object> args = Arrays.asList(point.getArgs());
System.out.println("AfterReturningThrowing FunctionName:" + methodName + ",ParameterName:" + args + ",Exception:" + e);
}
@Around("execution(public int com.sguess.service.*.*(int, int))")
public Object aroundMethod(ProceedingJoinPoint pdj) {
System.out.println("Start AroundFunction");
Object result = null;
try {
System.out.println("Around process start");
result = pdj.proceed();
System.out.println("Around process end");
} catch (Throwable e) {
System.out.println("Around process exception");
}
System.out.println("After Around process");
return result;
}
来源:https://blog.csdn.net/sanpic/article/details/82800017


猜你喜欢
- 笔者最近需要上位机与下位机进行数据交互,在广泛参考大佬的资料后,较为完善地使用Textbox控件进行数据输入的功能。程序段主要功能:实现输入
- 本文实例为大家分享了C语言实现两个矩阵相乘的具体代码,供大家参考,具体内容如下程序功能:实现两个矩阵相乘的C语言程序,并将其输出代码如下:#
- 对Jpa Entity关系映射中mappedBy的理解mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段数
- 一、前言跟很多小伙伴聊天,发现一个严重的问题,很多小伙伴横向发展的貌似很不错,很多技术都能说出一二,但是如果在某个技术上深挖一下就不行了,问
- 什么是线程池线程池(thread pool)是一种线程使用模式。线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能。
- 线程概念进程:启动一个应用程序就叫一个进程。 接着又启动一个应用程序,这叫两个进程。每个进程都有一个独立的内存空间;进程也是程序的一次执行过
- 附GitHub源码:WebViewExplore一、WebView的基础配置WebSettings ws = getSettings();w
- 1. strlen(),计算字符串长度 int strlen(const char string) {
- 前言本文主要给大家介绍了关于JDK8新增的原子性操作类LongAdder的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的
- JVM之方法返回地址JVM运行时数据区的虚拟机栈的栈帧中包含了返回地址当一个方法开始执行后,只有两种方式可以退出这个方法。第一种方式是执行引
- 一、下载https://www.eclipse.org/downloads/download.php?file=/oomph/epp/202
- springboot2启动时执行,初始化(或定时任务)servletContext需求:springboot 启动后自动执行,初始化数据,并
- 目录1.概览2.自定义枚举方法3.使用 == 比较枚举类型4.在 switch 语句中使用枚举类型5.枚举类型的属性,方法和构造函数6.En
- 一. Window 分类应用 Window(ApplicationWindow: 对应一个 Acitivity)
- package com.infomorrow.parser_report;import org.junit.Test;public clas
- 堆排序基本介绍1、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),
- 一、事务隔离级别①介绍数据库系统必须具有隔离并发运行各个事务的能力,使它们不会相互影响,避免各种并发问题。一个事 务与其他事务隔离的程度称为
- strings.xml 有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,感兴趣的小伙伴们可以参考一
- 这篇文章主要介绍了JAVA如何定义构造函数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可
- 一:算术运算符1.算术运算符有哪些①基本四则运算符:+ - * / %②增量赋值运算符:+= -= *= /= %=③自增/自减运算符++