0

因此,在我在这里找到的精彩文章之后,我正在尝试使用自己的一些注释来扩展 guice:http: //developer.vz.net/2012/02/08/extending-guice-2/

这对我来说很好,除了:

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

  final SchedulerService schedulerService = new SchedulerService();

这是隐藏的邪恶。这家伙很幸运,他只需要没有任何依赖关系的简单对象。但就我而言,我Service需要参考另外两个子服务。而且由于他曾经new创建Service我需要同时使用new这两个子服务,所以我将能够创建它。所以我不能在这些子服务中注入一些属性。实际上,我正在创建未指定的整个对象子树。

有办法解决吗?我可以让 GuiceService为我实例化然后注册它TypeListener吗?

4

1 回答 1

2

您实际上可以使用getProvider(在BinderAbstractModule上)从模块内访问注入项目的提供者,只要您保证get在 Injector 存在之前不调用。(如果你这样做,你会得到一个 IllegalStateException。)

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

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

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

Injector injectorWithoutListener = Guice.createInjector(new YourServiceModule());
YourService yourService = injectorWithoutListener.getInstance(YourService.class);
Injector finalInjector = injectorWithoutListener.createChildInjector(
    new YourInjectionListenerModule(yourService), new EverythingElseModule());

请注意,在父注入器中配置的具有单例行为的对象仍将在那里创建,因此在 中创建的实例finalInjector将与 中的实例共享单例行为injectorWithoutListener。您还可以阅读有关createChildInjector绑定解析顺序的更多信息。

于 2013-10-24T17:55:50.190 回答