Весной, когда я пишу EventHandler, я могу установить условие , чтобы отфильтровывать неинтересные события, например:
// I use lombok
public class TopicEvent extends ApplicationEvent {
@Getter @Setter private String topic;
@Getter @Setter private PayloadObject payload;
}
...
@EventListener(condition = "#event.topic eq \"ecology\"")
public void onEcologyTopicEvent(TopicEvent e) {
...
}
Что уже приятно. Но у него мало преимуществ по сравнению с
@EventListener
public void onEcologyTopicEvent(TopicEvent e) {
if (!e.getTopic().equals("ecology") { return; }
...
}
Я бы хотел предоставить пользователям моего TopicEvent аннотацию
@TopicEventListener(topic = "ecology")
public void onEcologyTopicEvent(TopicEvent e) {
...
}
У меня есть три идеи для этого:
1: Spring предлагает синтезированные аннотации и @AliasFor. Может быть, это можно использовать
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@EventListener
public @interface TopicEventListner {
@AliasFor(annotation = EventListener.class, /* can I tweak topic to the string #event.topic eq $topic? */)
String topic;
}
2: (Что кажется более правдоподобным) Могу ли я зарегистрировать некоторые компоненты инфраструктуры, может быть пользовательский ApplicationEventMulticaster
или добавить фильтры в EventListeners во время выполнения? Если так, то где было бы хорошее место для начала, то есть , который был бы классом / компонентом, который я должен был бы реализовать, чтобы зарегистрировать его где? , соответственно - где я мог бы подключиться к
3: Заменить @TopicEventListener(topic = "ecology")
на @EventListener(condition = "#event.topic eq \"ecology\"")
во время компиляции. Но этот подход кажется ... может быть, немного излишним, и я не имею ни малейшего понятия о таких вещах, и я ожидаю, что это будет очень сложно.
... Но я мог бы решить это в C ++ (с макросом)