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