Действительно ли возможно сказать Guice называть некоторый метод (т.е. init ()) после instantinating объект данного типа?
Я ищу функциональность, подобную @PostConstruct аннотации в EJB 3.
Если требуется назвать метод после конструкции экземпляра, это означает, что вызов метода постконструкции является на самом деле шагом создания экземпляра. В этом случае я рекомендовал бы абстрактному шаблону разработки фабрики решить эту проблему. Код может быть похожим на что-то вроде этого:
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)
В случае, если Вы должны инициализировать объект с помощью других объектов и после и готовы (который имеет место, если необходимо зарегистрироваться один в другой, и они также зависят друг от друга), можно легко сделать это как это:
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);
}
}