Guice называют init метод после instantinating объект

Действительно ли возможно сказать Guice называть некоторый метод (т.е. init ()) после instantinating объект данного типа?

Я ищу функциональность, подобную @PostConstruct аннотации в EJB 3.

62
задан mgamer 19 January 2010 в 12:18
поделиться

2 ответа

На самом деле, возможно.

Вам необходимо определить TypeleStener , чтобы получить функциональность. Что-то вдоль линий следующего в вашем модуле определение:

bindListener(Matchers.subclassesOf(MyInitClass.class), new TypeListener() {
    @Override
    public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) {
        typeEncounter.register(new InjectionListener<I>() {
            @Override
            public void afterInjection(Object i) {
                MyInitClass m = (MyInitClass) i;
                m.init();
            }
        });
    }
});
37
ответ дан 24 November 2019 в 16:46
поделиться

Если порядок имеет значение, необходимо сохранить свойство на объектах "T" в списке, которое обозначает последовательность. Чтобы поменять их местами, просто поменяйте значение этого свойства, а затем используйте его в .Sort ( сравнение со свойством последовательности )

-121--942556-

Очистить атрибут runat = "server" в теге shiderpages

-121--4693322-

guiceyfruit выполняет то, что требуется для методов, аннотированных с помощью @ PostConstruct или реализующих пружину InitionBean . Для этого также можно написать своих слушателей. Ниже приведен пример вызова открытого метода init () после создания объектов.

import com.google.inject.*;
import com.google.inject.matcher.*;
import com.google.inject.spi.*;

public class MyModule extends AbstractModule {
  static class HasInitMethod extends AbstractMatcher<TypeLiteral<?>> {
    public boolean matches(TypeLiteral<?> tpe) {
      try {
        return tpe.getRawType().getMethod("init") != null;
      } catch (Exception e) {
        return false;
      }
    }

    public static final HasInitMethod INSTANCE = new HasInitMethod();
  }

  static class InitInvoker implements InjectionListener {
    public void afterInjection(Object injectee) {
      try {
        injectee.getClass().getMethod("init").invoke(injectee);
      } catch (Exception e) {
        /* do something to handle errors here */
      }
    }
    public static final InitInvoker INSTANCE = new InitInvoker();
  }

  public void configure() {
    bindListener(HasInitMethod.INSTANCE, new TypeListener() {
      public <I> void hear(TypeLiteral<I> type, TypeEncounter<I> encounter) {
        encounter.register(InitInvoker.INSTANCE);
      }
    });
  }
}
7
ответ дан 24 November 2019 в 16:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: