通过创建元注释来重用注释

Reusing annotations by creating meta annotations

我只是想知道我们是否可以创建一个元注释并在任何地方重用它。例如,我有这样的注释:

@QueueBinding(value = @Queue, exchange = @Exchange(value = "MY_FANOUT_EXCHANGE", type = ExchangeTypes.FANOUT))

我需要在多个地方使用它。我只想将其简化为:

@MyFanoutExchangeBinding = @QueueBinding(value = @Queue, exchange = @Exchange(value = "MY_FANOUT_EXCHANGE", type = ExchangeTypes.FANOUT))

然后在所有地方使用 @MyFanoutExchangeBinding on 方法。如果我正确理解注释,那是不可能的。或者是?

元注释在此上下文中不起作用,因为 @RabbitListener bindings 属性 是 QueueBinding[] 并且注释没有继承。

要实现它需要一个自定义的 RabbitListenerAnnotationBeanPostProcessor 但是,由于它不能以通用的方式完成,我认为它不能成为框架的一部分,至少在你的方式中描述。

不过,我们也许可以通过其他方式减少样板文件;欢迎随时打开 JIRA issue 我们可以看看有什么可能。

编辑

收到 JIRA Issue 后,我又考虑了一些,您可以使用自定义侦听器注释实现您想要的结果,使用 @RabbitListener ...

进行元注释
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@RabbitListener(bindings = @QueueBinding(
        value = @Queue,
        exchange = @Exchange(value = "test.metaFanout", type = ExchangeTypes.FANOUT, autoDelete = "true")))
public @interface MyAnonFanoutListener {
}

public static class MetaListener {

    @MyAnonFanoutListener
    public void handle1(String foo) {
        ...
    }

    @MyAnonFanoutListener
    public void handle2(String foo) {
        ...
    }

}

每个侦听器都将获得一个绑定到扇出交换器的匿名、自动删除队列。