【发布时间】:2023-01-27 22:14:02
【问题描述】:
我在 Spring Boot 中创建了一个简单的自定义注解,它记录了一些东西并且它正在工作但仅适用于第一个注解,嵌套的注解不会被调用
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Traceable {
}
注释处理器(方面)
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class TraceableAspect {
@Around("@annotation(Traceable)")
public Object trace(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Inside Aspect");
Object result = joinPoint.proceed();
System.out.println(result);
return result;
}
}
用于测试的控制器示例
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/test")
public class ControllerTest {
@GetMapping("/get")
@Traceable
public String get(){
test1();
test2();
return "Hi";
}
@Traceable
public void test1(){
String str = "1";
System.out.println(str);
}
@Traceable
public Object test2(){
String str = "2";
System.out.println(str);
test1();
return null;
}
}
这里的控制台输出是:
Inside Aspect
1
2
1
Hi
但我认为它很糟糕,它必须是这样的:
Inside Aspect
Inside Aspect
1
Inside Aspect
2
Inside Aspect
1
Hi
似乎只处理了第一个@Traceable,其他的都被忽略了。如何处理?谢谢
【问题讨论】:
标签: java spring-boot annotations aop