1. 概述

本次,我利用 Spring Aop 的注解方式获取切入点的入参和出参,因为比较简单,所以就直接上代码了。

2. 代码编写

注解类

/**
* 日志注解
*
* @author Jiantao Yan
* @title: Log
* @date 2021/1/5 20:33
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
}

切入点

/**
* AOP 切入点测试
*
* @author Jiantao Yan
* @title: AopService
* @date 2021/1/5 20:29
*/
@Slf4j
@Service
public class AopService { @Log
public User save(User user) {
log.info("------>save user={}", user);
return user;
}
}

切面

/**
* 日志切面
*
* @author Jiantao Yan
* @title: LogAspect
* @date 2021/1/5 20:33
*/
@Slf4j
@Aspect
@Component
public class LogAspect { /**
* 以注解为切入点
*/
@Pointcut("@annotation(com.tao.leanrn.demo.aop.Log)")
public void pointcut() {
} /**
* 环绕通知
* @param proceedingJoinPoint
*/
@SneakyThrows
@Around("pointcut()")
public void around(ProceedingJoinPoint proceedingJoinPoint) {
// 获取入参
Object[] args = proceedingJoinPoint.getArgs();
for (Object arg : args) {
// 入参是否为 user
if (arg instanceof User) {
log.info("------->入参为user={}", (User)arg);
}
log.info("----->入参 arg={}", arg);
} // 获取出参
Object result = proceedingJoinPoint.proceed();
// 出参是否为 user
if (result instanceof User) {
log.info("------->入参为user,result={}", (User)result);
}
log.info("----->出参.result={}", result); }
}

实体类

/**
* 用户
*
* @author Jiantao Yan
* @title: User
* @date 2021/1/5 20:30
*/
@Data
public class User { private Long id; private String username; private Integer age;
}

3. 结果验证

单元测试编写

@Slf4j
@SpringBootTest
class AopServiceTest { @Autowired
private AopService aopService; @Test
void save() {
User user = new User();
user.setId(1L);
user.setAge(19);
user.setUsername("booleandev");
User user1 = aopService.save(user);
log.info("------------->user1={}", user1);
}
}

结果

2021-01-05 21:01:13.759  INFO 7440 --- [           main] com.tao.leanrn.demo.aop.LogAspect        : ------->入参为user=User(id=1, username=booleandev, age=19)
2021-01-05 21:01:13.774 INFO 7440 --- [ main] com.tao.leanrn.demo.aop.LogAspect : ----->入参 arg=User(id=1, username=booleandev, age=19)
2021-01-05 21:01:13.786 INFO 7440 --- [ main] com.tao.leanrn.demo.aop.AopService : ------>save user=User(id=1, username=booleandev, age=19)
2021-01-05 21:01:13.787 INFO 7440 --- [ main] com.tao.leanrn.demo.aop.LogAspect : ------->入参为user,result=User(id=1, username=booleandev, age=19)
2021-01-05 21:01:13.787 INFO 7440 --- [ main] com.tao.leanrn.demo.aop.LogAspect : ----->出参.result=User(id=1, username=booleandev, age=19)
2021-01-05 21:01:13.787 INFO 7440 --- [ main] com.tao.leanrn.demo.aop.AopServiceTest : ------------->user1=null

Spring Aop 获取入参和出参的更多相关文章

  1. 关于用mybatis调用存储过程时的入参和出参的传递方法

    一.问题描述 a)         目前调用读的存储过程的接口定义一般是:void  ReadDatalogs(Map<String,Object> map);,入参和出参都在这个map里 ...

  2. 字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一篇 Helloworld 中,我们初步尝试使用了 Javassist字节编程的 ...

  3. Spring AOP获取不了增强类(额外方法)或无法通过getBean()获取对象

    Spring AOP获取不了增强类(额外方法)和无法通过getBean()获取对象 今天在学习AOP发现一个小问题 Spring AOP获取不了额外方法,左思右想发现是接口上出了问题 先上代码 获取不 ...

  4. Spring AOP 自定义注解获取http接口及WebService接口入参和出参

    注解方法实现过程中可以采用如下获取方式:—以下为例  HttpServletRequest request = ((ServletRequestAttributes) RequestContextHo ...

  5. 使用filter获取http请求的出参以及入参

    首先 我们的目的是做一个拦截器 能够对http请求做profiler,能够记录本次的调用情况,这里说下如何从http请求中获取到出参的问题. 方案一:参照http://blog.csdn.net/wu ...

  6. spring aop获取目标对象的方法对象(包括方法上的注解)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  7. Spring AOP: 织入的顺序

    spring AOP 采用和 AspectJ 一样的优先顺序来织入增强处理:在进入连接点时,高优先级的增强处理将先被织入:在退出连接点时,高优先级的增强处理会后被织入. 当不同的切面里的两个增强处理需 ...

  8. Spring AOP获取拦截方法的参数名称跟参数值

    注意:这种方式需要JDK1.8版本支持 开始:http://www.cnblogs.com/wing7319/p/9592184.html 1.aop配置: <aop:aspectj-autop ...

  9. Spring AOP获取方法的参数名称和参数值

    aop配置: <aop:aspectj-autoproxy expose-proxy="true" /> @Before(value = "execution ...

  10. spring aop 获取request、response对象

    在网上看到有不少人说如下方式获取: 1.在web.xml中添加监听 <listener>          <listener-class>              org. ...

随机推荐

  1. Polarctf -- Re(1)

    Polarctf之简单逆向 1. shell 用exeinfope查看下程序结构, 发现存在upx壳 用upx工具脱壳, upx.exe -d shell.exe 再使用IDAPro打开 #flag{ ...

  2. 换个方式用C#开发微信小程序

    pre { overflow-y: auto; max-height: 300px }   前一阵子帮朋友开发个微信小程序,一开始使用Wechat Devtools开发,实在受不了转用uniapp开发 ...

  3. TVM: VisitExpr流程分析

    TVM源码中涉及到表达式遍历的地方,一般是适用VisitExpr接口进行,这个接口设计TVM的visitor模式,具体分析可参考:TVM:visitor设计模式 基类tvm::relay::ExprF ...

  4. RPC实战与核心原理之动态分组

    动态分组:超高效实现秒级扩缩容 回顾 在 RPC 里面怎么支持流量回放,应用在引入 RPC 后,所有的请求都会被 RPC 接管,而我们在 RPC 里面引入回放的原因也很简单,就是想通过线上流量来验证改 ...

  5. Merge Two Binary Trees——LeetCode进阶路

    原题链接https://leetcode.com/problems/merge-two-binary-trees/ 题目描述 Given two binary trees and imagine th ...

  6. WindowsPE文件格式入门11.资源表

    https://www.bpsend.net/thread-411-1-1.html 资源表 资源的管理方式采用windows资源管理器目录的管理方式,一般有三层目录. 根目录 结构体IMAGE_RE ...

  7. WPF 基于Transform实现画布超出边界触发计算

    有些场景需要对画布边界做界限控制,此时需要计算画布的四个方向的界限和极值 先看效果图: 画布在通过RenderTransform 做变换,由于在变换的过程中,实际的宽高没有改变,需要通过Transfo ...

  8. YashanDB V23.4 LTS全库闪回新特性解读

    柏杨 YashanDB存储研发技术专家 本文主要对YashanDB V23.4 LTS新版本的全库闪回新特性进行原理探讨与技术解析. 证券交易系统突发数据异常,三甲医院电子病历系统遭遇误操作...在这 ...

  9. odoo知识图谱

    最近项目交付后,准备将系统整个知识点整理一下,下面是目录,后面针对目录编写文档--todo

  10. 1 MyBatis动态SQL之综述和 if 语句

    摘要:使用 MyBatis 动态SQL,通过 if, choose, when, otherwise, trim, where, set, foreach和bind等标签,可组合成非常灵活的SQL语句 ...