Java 扩展guice——guicy方式

Java 扩展guice——guicy方式,java,guice,Java,Guice,因此,我正试图通过一些注释来扩展guice,这与我在这里找到的一篇伟大的文章非常相似: 这对我来说很好,除了: 现在,在我的模块中,我实例化了以下服务之一: 这就是隐藏的邪恶。这家伙很幸运,他只需要一个简单的对象,没有任何依赖关系。但是在我的例子中,我的服务需要引用另外两个子服务。由于他使用了new来创建服务,我需要对这两个子服务都使用new,这样我就可以创建它了。所以我不能向这些子服务中注入一些属性。实际上,我创建的是整个对象子树,而不是guicified 有办法绕过它吗?我可以让Guice为

因此,我正试图通过一些注释来扩展guice,这与我在这里找到的一篇伟大的文章非常相似:

这对我来说很好,除了:

现在,在我的模块中,我实例化了以下服务之一:

这就是隐藏的邪恶。这家伙很幸运,他只需要一个简单的对象,没有任何依赖关系。但是在我的例子中,我的
服务
需要引用另外两个子服务。由于他使用了
new
来创建
服务
,我需要对这两个子服务都使用
new
,这样我就可以创建它了。所以我不能向这些子服务中注入一些属性。实际上,我创建的是整个对象子树,而不是guicified


有办法绕过它吗?我可以让Guice为我实例化
服务
,然后在
TypeListener
中注册它吗?

您可以使用
getProvider
(on和)从模块内访问注入项的提供者,只要您承诺在注入存在之前不调用
get
。(如果你这样做了,你会后悔的。)

此时,您的代码如下所示:

Provider<YourService> yourServiceProvider = getProvider(YourService.class);
final InjectionListener injectionListener = new InjectionListener() {
  public void afterInjection(Object injectee) {
    yourServiceProvider().get().accept(injectee);
  }
}

请注意,在父注入器中配置了单例行为的对象仍将在父注入器中创建,因此在
finalInjector
中创建的实例将与
injectorwithoutliner
中的实例共享单例行为。您还可以阅读更多关于和的信息。

非常感谢您的努力。事实上,昨天晚些时候我在考虑这个问题时,也遇到了同样的想法。最好是带有独立喷油器的新模块。我不知道
childInjector
,虽然这让它清晰明了。希望你能尽快接受!
Provider<YourService> yourServiceProvider = getProvider(YourService.class);
final InjectionListener injectionListener = new InjectionListener() {
  public void afterInjection(Object injectee) {
    yourServiceProvider().get().accept(injectee);
  }
}
Injector injectorWithoutListener = Guice.createInjector(new YourServiceModule());
YourService yourService = injectorWithoutListener.getInstance(YourService.class);
Injector finalInjector = injectorWithoutListener.createChildInjector(
    new YourInjectionListenerModule(yourService), new EverythingElseModule());