avaje-inject
avaje-inject copied to clipboard
Add something like Jakarta `@Observes`
- Adds the
Observer,Event<T>, andObserverManagerclasses for registering observer methods and firing events. - Adds new
@Observesannotation and generates code to register in DI classes - Adds an
@EventTypemarker annotation that will auto-generateEvent<T>implementations - like Jakarta EE, supports generic events, wildcards, and injecting beans when an event is fired.
Given the following two classes:
@EventType
class CustomEvent {
}
@Singleton
class TestObserver {
void observe(@Observes @Named("qualified") CustomEvent e) {}
}
Will generate these two classes:
@Component
@Generated("avaje-inject-generator")
public class CustomEventPublisher extends Event<CustomEvent> {
//for generic types and arrays the user will have to manually create this publisher though
public CustomEventPublisher (ObserverManager manager) {
super(manager.observers(CustomEvent.class));
}
}
@Generated("io.avaje.inject.generator")
public final class TestObserver$DI {
/**
* Create and register TestObserver.
*/
public static void build(Builder builder) {
if (builder.isAddBeanFor(TestObserver.class)) {
var bean = new TestObserver();
builder.register(bean);
Consumer<CustomEvent> observe = bean::observe;
builder.<CustomEvent>registerObserver(false, CustomEvent.class, observe, "qualified");
}
}
}
resolves #489