下面这段代码是什么意思@Pointcut("@annotation(com.tplinknbu.paymentcenter.deprecated.annotation.LogRequired)") public void logPointcut() { // 切点定义 } @Around("logPointcut()") public Object handlerStat(ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); Set<Entry<String, String[]>> entries = getHttpRequestPrameterSet(requestAttributes); Map<Object, Object> parameterMap = new HashMap<>(); for (final Entry<String, String[]> entry : entries) { parameterMap.put(entry.getKey(), Arrays.toString(entry.getValue())); } Object response = null; long startAtNs = systemTime.getMilliseconds(); try { response = pjp.proceed(); } finally { List<Object> requestArgs = new ArrayList<>(); Arrays.asList(pjp.getArgs()).forEach(obj -> { if (obj instanceof MultipartFile) { // } else if (obj instanceof HttpServletRequest || obj instanceof HttpServletResponse || obj instanceof ServletRequest || obj instanceof ServletResponse) { // mapper.valueToTree 无法转化 HttpServletRequest } else { requestArgs.add(obj); } }); long durationInMills = systemTime.getMilliseconds() - startAtNs; toJsonPoint(method.getName(), requestArgs, parameterMap, response, durationInMills); } return response; }
时间: 2024-02-14 09:19:28 浏览: 137
【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知
这段代码是一个基于 Spring AOP 的切面,用于记录某些方法的运行时间、参数、返回结果等信息。首先,通过 @Pointcut 注解定义一个切点,该切点的条件是被 @LogRequired 注解标注的方法。然后,使用 @Around 注解定义一个环绕通知,该通知会在切点处切入,执行被切入的方法。在通知中,首先记录请求参数,然后执行被切入的方法,并记录执行时间和返回结果,最后将这些信息序列化成 JSON 格式,输出到日志中。需要注意的是,该切面对 HttpServletRequest、HttpServletResponse 等对象不做处理。
阅读全文