Guice вызов init метод после мгновенного объекта
можно ли сказать Guice, чтобы вызвать некоторый метод (т. е. init ()) после мгновенный объект данного типа?
Я ищу функциональность, аналогичную аннотации @PostConstruct в EJB 3.
5 ответов:
на самом деле, это возможно.
необходимо указать
TypeListener
чтобы получить функциональность. Что-то вроде следующего в определении вашего модуля: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(); } }); } });
Вы можете просто добавить
@Inject
аннотации кinit()
метод. Он будет запускаться автоматически после создания экземпляра объекта.
Мне нравится http://code.google.com/p/mycila/wiki/MycilaGuice. это поддерживает Guice 3, кроме http://code.google.com/p/guiceyfruit.
guiceyfruit делает то, что вы ищете для методов, аннотированных с
@PostConstruct
или реализации веснойInitializingBean
. Для этого также можно написать своих собственных слушателей. Вот пример, который вызывает publicinit()
метод после создания объектов.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); } }); } }