延伸guice - guicy方式

时间:2013-10-24 15:03:35

标签: java guice

所以我试着用我自己的一些注释扩展guice几乎跟随我在这里找到的伟大文章:http://developer.vz.net/2012/02/08/extending-guice-2/

除了事情之外,这对我来说还算不错:

  

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

  final SchedulerService schedulerService = new SchedulerService();

这是隐藏的邪恶。这家伙很幸运,他只需要简单的对象而没有任何依赖。但在我的情况下,我的Service需要引用另外两个子服务。由于他使用new来创建Service我需要对两个子服务使用new,因此我将能够创建它。所以我不能在这些子服务中注入一些属性。实际上,我正在创建整个对象子树,而不是guicified。

周围有办法吗?我可以让Guice为我实例化Service然后在TypeListener注册吗?

1 个答案:

答案 0 :(得分:2)

您实际上可以使用getProviderBinderAbstractModule)从模块内访问注入商品的提供商,只要您保证不会拨打{{1}直到注入器存在之后。 (如果你这样做,你将get an IllegalStateException。)

此时你的代码看起来像这样:

get

这里唯一的问题是注入你的服务及其依赖项也可能会尝试触发你的InjectionListener,可能会导致无限循环。您可以通过添加空保护并在服务为空时忽略所有注入来解决此问题。不过,更好的选择可能是创建一个没有监听器来引导YourService的注入器,并将监听器添加到子注入器中:

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()); 中创建的实例将与finalInjector中的实例共享单例行为。您还可以阅读有关createChildInjectorbinding resolution order的更多信息。