【问题标题】:Java and @annotationsJava 和@annotations
【发布时间】:2018-11-05 04:01:30
【问题描述】:

在使用 Java 注释时,我不确定要理解一些事情。这是一个例子:

我创建了一个@Log 注解并添加了一些功能(每个使用@Log 注解的方法在执行方法之前都会运行一些日志)。

现在我正在创建一个像这样的新 @SuperLog 注释:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Log
public @interface SuperLog {
     ............
}

这个@SuperLog 必须提供@Log 所做的所有内容,以及一些特定于@SuperLog 的额外内容。

不幸的是,当我执行一些用@SuperLog 注释的方法时,@Log 特定的日志不会执行。

我不明白为什么:@SuperLog 用 @Log 注释的事实并不意味着它“继承”了 @Log 的属性? @SuperLog 不应该做所有@Log 应该做的事情吗?

【问题讨论】:

    标签: java spring jakarta-ee annotations


    【解决方案1】:

    我猜你'执行一些注解@SuperLog'的方法意味着使用'Spring AOP'。

    正如 GhostCat 所说,inheritance 取决于框架的实现。不幸的是,Spring AOP 切入点还不支持元注释。

    你可以关注this spring improvement

    【讨论】:

      【解决方案2】:

      正如question 所述,注释没有继承。

      除此之外:请记住,注释(主要)在运行时才有意义,因为某些框架会对它们的存在做出反应。

      换句话说:您可以创建一个框架,以某种方式支持带有继承树的注释。但是假设你正在使用一些现有的框架,你必须接受这个框架在做什么。

      【讨论】:

      • 谢谢,但是有了 SpringBootApplication 注释,我注意到它被 ComponentScan、EnableAutoConfiguration 等注释了。这个 SpringBootApplication 注释确实提供了这些其他注释提供的所有服务。所以看起来确实有一些“继承”
      • @AntonBoarf 正如所说,这取决于框架到底在做什么。换句话说:当框架执行 instanceof 时,不支持“继承”。但是当框架“扫描”每个注释时,它可以很好地确定这些继承的方面。
      • 这是否意味着当(以我的第一个例子)我用 Log 注释注释我的 SuperLog 注释时,默认情况下它什么都不做。我必须负责注意到 SuperLog 用 Log 注释并自己实现我想要的逻辑,对吗?
      • 这也是我要在这里得出的结论。
      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 2010-10-07
      • 2015-02-25
      • 1970-01-01
      • 2017-11-15
      • 2020-12-24
      • 2011-04-02
      • 1970-01-01
      相关资源
      最近更新 更多