回答
其实功能,这是可能的。
您需要定义一个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();
}
});
}
});
另外一种选择是使用GuicyFruit,它声称支持@PostConstruct(请参阅http://code.google.com/p/guiceyfruit /),虽然它没有回答这个问题,但我认为值得一提的是,如果你(仅)使用构造器注入,你不需要这样的功能,你可以在构造器中完成所有的初始化。 – Eelco 2010-02-28 09:19:56
救了我一天。 @PostConstruct目前还不支持guiceyfruit – 2010-03-10 09:41:12
Matchers.subclassesOf(MyInitClass.class)实际上会导致编译时错误: “AbstractModule类型中的方法bindListener(Matcher <?super TypeLiteral >>,TypeListener)不适用(Matcher
guiceyfruit确实是想与注解的方法后是什么@PostConstruct
或实施春天的InitializingBean
。也可以编写自己的监听器来执行此操作。这是一个在创建对象后调用公共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);
}
});
}
}
感谢您的好例子,只是想知道如果getMethod(“”)返回null,因为当它没有找到指定的方法时,它会抛出NoSuchMethodException,并且javadoc也不会对此做出任何评论。 – zeratul021 2010-11-21 02:12:37
我喜欢http://code.google.com/p/mycila/wiki/MycilaGuice。这支持Guice 3,而不是http://code.google.com/p/guiceyfruit。
注意mycila-guice 3.6只适用于Guice 4.0,但不适用4.1;请参阅https://github.com/mycila/guice/issues/11。 – vorburger 2016-09-02 14:39:06
您可以将@Inject
注释添加到您的init()
方法中。对象实例化后它会自动运行。
问题是,如果你有可选的依赖关系,这种方法不起作用,因为根据我所知,没有办法告诉guice调用你的init()方法作为最后一个方法。恕我直言,他们需要@PostConstruct支持。 – 2012-04-04 13:12:18
我正在使用构造函数注入,我必须做一些取决于其他依赖关系的初始化东西。 – 2014-11-04 15:27:30
@OrtwinAngermeier,如果我正确理解你的话,你可以在你的构造函数_and_的init方法中放入一个@Inject注解。 – 2015-10-02 20:12:15
GWizard包含一个模块(gwizard-services
),它以Guice友好的格式提供Guava服务。番石榴服务为您提供并行线程的生命周期管理。
- 1. 初始化对象后的方法nullreference
- 2. 初始化父对象后初始化相关的对象
- 3. 初始化方法调用
- 4. 对象初始化语法
- 5. 初始化对象
- 6. 对象初始化
- 7. 初始化对象
- 8. 初始化对象
- 9. 对象初始化
- 10. JavaScript:初始化对象后初始化内部变量
- 11. 在初始化列表中初始化引用对象成员
- 12. 初始化方法
- 13. Swift对象初始化(类工厂方法,默认初始化,方便初始化)
- 14. 初始化方法中的对象 - MQL5
- 15. JUnit Mockito对象初始化方法
- 16. 初始化方法;自对象的LEN()
- 17. 超在初始化对象
- 18. 正在初始化对象
- 19. 初始化对象时,实例变量始终未初始化?
- 20. 用不同的方法初始化变量/对象与全局初始化
- 21. 使用初始化块初始化对象
- 22. 不能在成员初始化列表初始化对象
- 23. 请参考初始化中正在初始化的对象吗?
- 24. 初始化对
- 25. 用数组或初始化初始化一个NSMutableArray初始化
- 26. 在ASP.NET Core中使用DI初始化初始化对象的对象
- 27. 在未初始化的对象上调用方法(空指针)
- 28. 如何在对象初始化时调用方法?
- 29. JNI可以在初始化时调用对象的方法吗?
- 30. (JAVA)在一行中初始化对象 - 调用方法
不幸的是,它看起来像吉斯的作者并没有刻意添加@PostConstruct https://github.com/google/guice/issues/62#issuecomment-115452493,这并强烈限制的适用性Guice(有解决方法,但这些都非常冗长)。您可能需要查看其他一些框架,例如Spring或JEE CDI(例如Weld) – arcuri82 2016-12-26 19:21:24