java语言,在controller类上写一个注解,然后通过aop来实现记录这个类每个方法被调用时的url路径和方法的JavaDoc注释
时间: 2024-02-01 18:15:10 浏览: 83
首先,在controller类上写一个注解,可以定义如下:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface LogController {
String value() default "";
}
```
其中,`@Retention(RetentionPolicy.RUNTIME)` 表示该注解会在运行时保留,并可以通过反射来获取该注解的信息;`@Target(ElementType.TYPE)` 表示该注解可以用在类上面。
然后,在AOP中实现记录每个方法被调用时的url路径和方法的JavaDoc注释,可以定义如下:
```java
@Aspect
@Component
public class LogAspect {
@Pointcut("@within(LogController)")
public void logPointcut() {
}
@Around("logPointcut()")
public Object aroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取类上的LogController注解
LogController controllerAnnotation = AnnotationUtils.findAnnotation(joinPoint.getTarget().getClass(), LogController.class);
// 获取注解中的value值,即请求路径
String requestPath = controllerAnnotation.value();
// 获取方法上的JavaDoc注释
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
String javaDoc = method.getAnnotation(Deprecated.class).toString(); // 这里以@Deprecated注解为例
// 记录日志
System.out.println("Request Path: " + requestPath);
System.out.println("JavaDoc: " + javaDoc);
// 执行目标方法
Object result = joinPoint.proceed();
return result;
}
}
```
在上述代码中,`@Pointcut("@within(LogController)")` 表示匹配所有被 `@LogController` 注解修饰的类;`joinPoint.getTarget().getClass()` 可以获取到目标类;`MethodSignature` 可以获取到目标方法的签名信息;`method.getAnnotation(Deprecated.class)` 可以获取到目标方法上的 `@Deprecated` 注解。最后,在日志中记录请求路径和JavaDoc注释,并执行目标方法。
阅读全文