avaje-inject icon indicating copy to clipboard operation
avaje-inject copied to clipboard

Add something like Jakarta `@Observes`

Open SentryMan opened this issue 1 year ago • 0 comments

  • Adds the Observer, Event<T>, and ObserverManager classes for registering observer methods and firing events.
  • Adds new @Observes annotation and generates code to register in DI classes
  • Adds an @EventType marker annotation that will auto-generate Event<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

SentryMan avatar Jan 27 '24 03:01 SentryMan