提问人:AntonBoarf 提问时间:5/26/2018 最后编辑:GhostCatAntonBoarf 更新时间:4/1/2019 访问量:160
Java 和 @annotations
Java and @annotations
问:
在使用 Java 注解时,我不确定是否理解。下面是一个例子:
我创建了一个@Log注解并用它添加一些功能(每个用@Log注解的方法在执行该方法之前都会运行一些日志)。
现在我正在创建一个新的@SuperLog注释,如下所示:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Log
public @interface SuperLog {
............
}
这个@SuperLog必须提供@Log所做的所有东西,以及一些特定于@SuperLog的额外东西。
不幸的是,当我执行一些用 @SuperLog 注释的方法时,特定于 @Log 的日志不会执行。
我不明白为什么:@SuperLog用@Log注释的事实并不意味着它“继承”了@Log属性?@SuperLog不应该做@Log应该做的每一件事吗?
答:
6赞
GhostCat
5/26/2018
#1
正如这个问题所概述的,注解没有继承。
除此之外:请记住,注解(主要)在运行时获得意义,因为某些框架会对它们的存在做出反应。
换句话说:你可以创建一个框架,以某种方式支持继承树附带的注解。但是假设你正在使用一些现有的框架,你必须接受这个框架正在做的事情。
评论
0赞
AntonBoarf
5/26/2018
谢谢,但是使用SpringBootApplication注解,我注意到它使用ComponentScan,EnableAutoConfiguration等进行了注解。这个 SpringBootApplication 注解确实提供了这些其他注解提供的所有服务。所以看起来确实有一些“继承”
1赞
GhostCat
5/26/2018
@AntonBoarf 如前所述,这取决于框架到底在做什么。换句话说:当框架这样做时,则不支持“继承”。但是当框架“扫描”每个注解时,它可以很好地确定这些继承的方面。instanceof
1赞
AntonBoarf
5/26/2018
所以这是否意味着当(以我的第一个例子)我用日志注解来注释我的 SuperLog 注解时,默认情况下它什么都不做。我必须负责注意到 SuperLog 是用 Log 注解的,并实现我想要的逻辑,对吗?
0赞
GhostCat
5/29/2018
这也是我在这里得出的结论。
1赞
Dean Xu
5/28/2018
#2
我猜你“执行一些@SuperLog注释的方法”意味着使用“Spring AOP”。
正如 GhostCat 所说,这取决于框架的实现。不幸的是,Spring AOP pointcut 还不支持元注解。inheritance
您可以关注此春季改进。
评论