记录请求参数和执行时间(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 @ 2022-07-05 10:48  java架构师1  阅读(299)  评论(0)    收藏  举报