AOP进阶-05.连接点

server/2025/2/27 5:38:18/

一.连接点 

JoinPoint有两个,要使用org,aspectj.lang

java">package com.gjw.aop;import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;import java.util.Arrays;/*** 目标:掌握AOP中的连接点技术*      所谓连接点,就是可以被AOP控制的方法,而在SpringAOP中,这个链接点又特指方法的执行* 在Spring中用JoinPoint抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等*      对于@Around通知,获取连接点信息只能使用 ProceedingJoinPoint*      对于其他四种通知,获取连接点信息只能使用JoinPoint,它是ProceedingJoinPoint的父类型*/
@Slf4j
@Component
@Aspect
public class MyAspect8 {@Pointcut("execution(* com.gjw.service.impl.DeptServiceImpl.*(..))")public void pt(){}@Around("pt()")public Object around(ProceedingJoinPoint joinPoint) throws Throwable {log.info("MyAspect8 around before......");// 1.   获取 目标对象的类名String className = joinPoint.getTarget().getClass().getName();log.info("目标对象的类名:{}",className);// 2.   获取  目标对象的方法名String methodName = joinPoint.getSignature().getName();log.info("目标对象的方法名:{}",methodName);// 3.   获取  目标方法运行时传入的参数Object[] args = joinPoint.getArgs();log.info("目标方法运行时传入的参数:{}", Arrays.toString(args));// 4.   放行  目标方法执行Object result = joinPoint.proceed();// 5.   获取  目标方法运行后的返回值log.info("目标方法运行后的返回值:{}", result);log.info("MyAspect8 around after");return result;}
}

Test中的测试代码

java">package com.gjw.springbootaopquickstart;import com.gjw.pojo.Dept;
import com.gjw.service.DeptService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class SpringbootAopQuickstartApplicationTests {@Autowiredprivate DeptService deptService;@Testvoid contextLoads() {}@Testpublic void testAopDelete() {deptService.deleteById(10);}@Testpublic void testAopList() {List<Dept> list = deptService.list();System.out.println(list);}@Testpublic void testAopGetById() {Dept dept = deptService.getById(1);System.out.println(dept);}}

执行testAopList()方法,执行结果如下:

如果我们将result返回的结果改为null,则list方法(原始方法)就拿不到返回值了。返回null,就相当于原始方法执行完后,结果就丢了。因此要将result返回回去,设置通知方法的返回值类型为Object。 

 执行testAopDelete()方法,执行结果如下:

delete方法没有返回值。 


http://www.ppmy.cn/server/170948.html

相关文章

low rank decomposition如何用于矩阵的分解

1. 什么是矩阵分解和低秩分解 矩阵分解是将一个矩阵表示为若干结构更简单或具有特定性质的矩阵的组合或乘积的过程。低秩分解&#xff08;Low Rank Decomposition&#xff09;是其中一种方法&#xff0c;旨在将原矩阵近似为两个或多个秩较低的矩阵的乘积&#xff0c;从而降低复…

开源基准测试模拟器:BlueROV2 水下机器人的控制(更改Z方向控制器)

开源基准测试模拟器:BlueROV2 水下机器人的控制(更改Z方向控制器) 将原有项目的z方向控制器由自适应滑膜控制器(ASMC)更改为自抗扰控制器(ADRC) 原Z控制器 更改为ADRC后图像 原自适应滑膜控制器代码 function u =

django model.object.filter 不等于多个值

关于Django中QuerySet.filter()的使用问题。首先&#xff0c;我会分别针对“不等于多个值”的代码开发问题和可能遇到的报错问题给出解答。 代码开发问题&#xff1a;QuerySet.filter()不等于多个值 在Django中&#xff0c;如果你想在查询中排除多个值&#xff0c;可以使用__i…

C++ Primer Plus第八章课后习题总结

1. 编写通常接受一个参数&#xff08;字符串的地址&#xff09;&#xff0c;并打印该字符串的函数。然而&#xff0c;如果提供了第二个参数&#xff08;int类型&#xff09;&#xff0c;且该参数不为0&#xff0c;则该函数打印字符串的次数将为该函数被调用的次数&#xff08;注…

Springboot使用Milvus的基本操作

Milvus 先得保证数据的正确安装并且正确运行 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId> </dependency> <dependency><groupId>io.milvus</groupId><artifactId>milvu…

Express + MongoDB 实现更新用户时用户名变化验证数据库是否存在,不变不验证

User.findById()&#xff1a;方法根据用户 ID 查找当前用户的信息&#xff0c;若用户不存在则返回 404 错误。 User.findOne()&#xff1a;方法检查新用户名是否已存在于数据库中。 User.findByIdAndUpdate()&#xff1a;方法更新用户信息&#xff0c;new: true 表示返回更新后…

安卓好软-----车机端 安卓tv端很好用的应用管家 adb 授权等等功能

应用管家是一款完全免费且实用的安卓平台系统管理工具&#xff0c;专为管理电视、车机的应用及文件而设计。其支持提取/卸载禁用自带应用、传送安装、清理及本地文件查找编辑压缩等等功能。 众所周知&#xff0c;当前市面上大多数厂家智能电视系统均基于谷歌原生安卓进行了“深…

Deep Searcher成为企业级RAG最新范式教程参考

教程参考 普通人想要分析一家公司,可以收集到的数据信息一般可以分为3类:公司财报、第三方机构的研报或者专业财经自媒体的分析博客、和公司以及行业相关的新闻。过去,要想在企业级场景用好这些数据,我们必须先对这些材料进行复杂的处理流程。 但是Deep Searcher,基于向…