需求上 MyController 中不需要重写父类中方法的逻辑,仅仅注解中 testField 的值不是默认值。
因为不想仅仅为了指定下 testField 而去重写多个方法,所以考虑字类初始化的时候,批量修改 testField 。
但是请求接口的时候,通过观察切面中的日志输出,子类中非重写的方法 method3 的注解对象中的 testField 是被修改为了 test2 ;而请求接口 method1 、method2 的时候,testField 还是 test1,并且切面中输出的注解对象的地址与 static 代码块中输出的不同。
Spring 的 AOP,注解、反射工具类是 hutool 的。
// 注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MyAnnotation {
String testField() default "test1";
}
// 抽象控制器
public abstract class AbstractController{
@MyAnnotation
@RequestMapping(value = "method1", method = RequestMethod.GET)
public RestfulResponse<Boolean> method1() {
return new RestfulResponse<>(true);
}
@MyAnnotation
@RequestMapping(value = "method2", method = RequestMethod.GET)
public RestfulResponse<Boolean> method2() {
return new RestfulResponse<>(true);
}
}
// 继承抽象控制器
@RestController
public class MyController extends AbstractController {
static {
for (Method method : ReflectUtil.getMethods(MyController.class)) {
if (AnnotationUtil.hasAnnotation(method, MyAnnotation.class)) {
MyAnnotation annotation = AnnotationUtil.getAnnotation(method, MyAnnotation.class);
AnnotationUtil.setValue(annotation, "testField", "test2");
// 输出 annotation 地址
}
}
}
@MyAnnotation
@RequestMapping(value = "method3", method = RequestMethod.GET)
public RestfulResponse<Boolean> method3() {
return new RestfulResponse<>(true);
}
}
// 切面
@Aspect
public class MyAspect implements Ordered {
@Around("@annotation(myAnnotation)")
public Object around(ProceedingJoinPoint pjp, MyAnnotation myAnnotation) throws Throwable {
// 输出 myAnnotation 地址、testField 值
return pjp.proceed();
}
}
请问是那里出了问题,为什么切面中获取到的注解对象和 static 中的不是同一个?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.