Guice在一个对象瞬间调用init方法

是否有可能告诉Guice在瞬间给定types的对象后调用一些方法(即init())?

我在EJB 3中寻找类似于@PostConstruct注释的function。

其实,这是可能的。

您需要定义一个TypeListener才能实现function。 在你的模块定义中沿着以下几行:

 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()方法中。 对象实例化后它会自动运行。

guiceyfruit做你以后用@PostConstruct注解的方法或实现spring的InitializingBean 。 也可以编写自己的监听器来执行此操作。 这是一个在创build对象之后调用一个公共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); } }); } } 

GWizard包括一个模块( gwizard-services ),它以Guice友好的格式提供Guava服务。 番石榴服务为您提供并行线程的生命周期pipe理。

https://github.com/stickfigure/gwizard