我正在尝试将spring @Controller
的baseurl外部化为控制器类的静态String
成员。如果我这样做,我必须公开该成员 - 否则它将不会被@RequestMapping
注释看到。我不明白为什么 - 这不是班级的注释部分吗?
有人可以解释为什么我不得不在这里使用private
吗?
无效:
@Controller
@RequestMapping(PendingApprovalsController.CONTROLLER_URL)
public class PendingApprovalsController {
private static final String CONTROLLER_URL = "/some/url";
...
}
有效:
@Controller
@RequestMapping(PendingApprovalsController.CONTROLLER_URL)
public class PendingApprovalsController {
public static final String CONTROLLER_URL = "/some/url";
...
}
答案 0 :(得分:5)
注释是一个普通的Java类本身。除非使用普通的Java规则对它们可见,否则它无法看到带注释的类的成员。此外,注释的存在可以由运行时的其他代码用于对注释类的成员进行操作;如果这些成员不可见,则无法执行这些操作。
来自JDK文档包的This page讨论了如何定义自定义注释,以及如何使用代码中应用的注释,这在这方面具有启发性。要定义注释类型,请执行类似
的操作public @interface Copyright {
String value();
}
您的自定义注释被定义为一种特殊的Java接口;在用户中,JVM根据需要提供运行时实现。但需要注意的关键是如何使用自定义注释,例如:
Method m = ... // Get a java.lang.reflect.Method object from somewhere
if (m.hasAnnotation(Copyright.class)) ...
请注意,这里我们引用注释类型的类对象,证明注释被编译为普通的Java类型。