记录请求参数和执行时间(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;
    }
}
复制代码

 

posted @   java架构师1  阅读(279)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示