下面这段代码是什么意思@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 12:19:28 浏览: 150
这段代码是一个基于 Spring AOP 的切面,用于记录某些方法的运行时间、参数、返回结果等信息。首先,通过 @Pointcut 注解定义一个切点,该切点的条件是被 @LogRequired 注解标注的方法。然后,使用 @Around 注解定义一个环绕通知,该通知会在切点处切入,执行被切入的方法。在通知中,首先记录请求参数,然后执行被切入的方法,并记录执行时间和返回结果,最后将这些信息序列化成 JSON 格式,输出到日志中。需要注意的是,该切面对 HttpServletRequest、HttpServletResponse 等对象不做处理。
相关问题
@Pointcut("@annotation(com.ais.dsg.common.log.annotation.SysOptLog)") public void sysLogAspect() { }什么意思
这是一个使用Spring AOP切面编程的代码片段,其中包含了@Pointcut注解。具体来说:
- @Pointcut:表示定义一个切入点,用来匹配需要被切入的方法。
- "@annotation(com.ais.dsg.common.log.annotation.SysOptLog)":表示匹配被@SysOptLog注解标注的方法。
- public void sysLogAspect() {}:表示切入点的方法名称,这个方法没有具体的实现,只是用来定义一个切入点。
因此,这段代码的意思是:定义一个切入点方法sysLogAspect(),用来匹配被@SysOptLog注解标注的方法。当我们在其他的切面中需要匹配被@SysOptLog注解标注的方法时,可以直接使用这个切入点方法,而不需要重复定义匹配规则。
需要注意的是,这里的@SysOptLog注解是自定义的注解,可能和其他项目的注解定义不同。
@pointcut(@annotation)
@pointcut(@annotation)是Spring AOP中的一个注解,它可以用来指定一个切点,该切点选择所有带有特定注解的方法或类。例如,如果我们想要记录所有带有@Log注解的方法的日志,我们可以定义一个切点,使用@pointcut(@annotation(Log.class))注解来选择这些方法。
在使用@pointcut(@annotation)注解时,我们需要注意一些细节。首先,我们需要确保在我们的应用程序中存在我们选择的注解。此外,我们需要确保我们的Spring AOP配置正确,以便我们的切面可以正常工作。
除了选择注解之外,@pointcut还可以用于其他选择器,例如方法名、类名、参数类型等等。这些选择器可以组合在一起,从而创建更复杂的切点,以满足我们的业务需求。
总的来说,@pointcut(@annotation)是一个非常有用的注解,它让我们可以轻松地选择需要执行切面的方法或类,并能够快速地实现AOP的功能。
阅读全文