记录请求参数和执行时间(AOP实现)
记录请求参数和执行时间(AOP实现)
1.添加依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.3.21</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.7</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
2.写controller
package com.example.webtest.com.test; import org.springframework.web.bind.annotation.*; /** * @ProjectName: webTest * @Package: com.example.webtest.com.test * @ClassName: Hello * @Author: xzj * @Description: * @Date: 2022/7/5 9:23 * @Version: 1.0 */ @RequestMapping("/receive") @RestController public class Hello { @GetMapping("/hello") public String hello(String msg){ return "hello" + msg; } @PostMapping("/helloPost") public String helloPost(@RequestBody A a){ return "helloPost" + a; } }
3.定义切面
package com.example.webtest.com.test; 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.aspectj.lang.reflect.CodeSignature; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; /** * @ProjectName: webTest * @Package: com.example.webtest.com.test * @ClassName: AOPTest * @Author: xzj * @Description: * @Date: 2022/7/5 9:37 * @Version: 1.0 */ @Aspect @Component public class AOPTest { @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)") public void requestMapping() { } @Around("requestMapping()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { // 类名 String className = joinPoint.getTarget().getClass().getName(); //方法名 String methodName = joinPoint.getSignature().getName(); long l = System.currentTimeMillis(); Map<String, Object> params = getNameAndValue(joinPoint); StringBuilder sb = new StringBuilder(1024); for (Map.Entry<String, Object> entry : params.entrySet()) { sb.append(entry.getKey()).append('=').append(entry.getValue()).append(" "); } System.out.println(String.format("类:%s 的方法:%s 被调用 参数为:%s", className, methodName, sb.toString())); Object object = joinPoint.proceed(); //执行连接点方法,object:方法返回值 System.out.println("执行时间:" + (System.currentTimeMillis() - l)); return object; } /** * @param joinPoint * @return * @Author xzj * @Description //TODO * @Date 9:48 2022/7/5 **/ Map<String, Object> getNameAndValue(ProceedingJoinPoint joinPoint) { Map<String, Object> param = new HashMap<>(); Object[] paramValues = joinPoint.getArgs(); String[] paramNames = ((CodeSignature) joinPoint.getSignature()).getParameterNames(); for (int i = 0; i < paramNames.length; i++) { param.put(paramNames[i], paramValues[i]); } return param; } }
分类:
aop
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】