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()
方法中。 对象实例化后它会自动运行。
我喜欢http://code.google.com/p/mycila/wiki/MycilaGuice 。 除了http://code.google.com/p/guiceyfruit以外,它还支持Guice 3。
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理。