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

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

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

61
задан 19 January 2010 в 15:18

2 ответа

Если требуется назвать метод после конструкции экземпляра, это означает, что вызов метода постконструкции является на самом деле шагом создания экземпляра. В этом случае я рекомендовал бы абстрактному шаблону разработки фабрики решить эту проблему. Код может быть похожим на что-то вроде этого:


class A {
    public A(Dependency1 d1, Dependency2 d2) {...}

    public postConstruct(RuntimeDependency dr) {...}
}

interface AFactory {
    A getInstance(RuntimeDependency dr);
}

class AFactoryImpl implements AFactory {
    @Inject
    public AFactoryImpl(Dependency1 d1, Dependency2 d2) {...}

    A getInstance(RuntimeDependency dr) {
        A a = new A(d1, d2);
        a. postConstruct(dr);
        return a;
    }
}

// in guice module
bind(AFactory.class).to(AFactoryImpl.class)
1
ответ дан 31 October 2019 в 15:53

В случае, если Вы должны инициализировать объект с помощью других объектов и после и готовы (который имеет место, если необходимо зарегистрироваться один в другой, и они также зависят друг от друга), можно легко сделать это как это:

public final class ApplicationModule extends AbstractModule {

  @Override
  protected void configure() {
    requestStaticInjection(ApplicationModule.class);
  }

  @Inject
  static void injectApplication(
      ReslSession reslSession,
      Set<Saga> sagas,
      Set<Reaction> reactions
  ) {
    sagas.forEach(reslSession::registerSaga);
    reactions.forEach(reslSession::registerReaction);
  }

}
0
ответ дан 31 October 2019 в 15:53

Другие вопросы по тегам:

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