您实际上可以使用getProvider
(在Binder和AbstractModule上)从模块内访问注入项目的提供者,只要您保证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和绑定解析顺序的更多信息。