所以我试着用我自己的一些注释扩展guice几乎跟随我在这里找到的伟大文章:http://developer.vz.net/2012/02/08/extending-guice-2/
除了事情之外,这对我来说还算不错:
现在在我的模块中,我实例化了以下服务之一:
final SchedulerService schedulerService = new SchedulerService();
这是隐藏的邪恶。这家伙很幸运,他只需要简单的对象而没有任何依赖。但在我的情况下,我的Service
需要引用另外两个子服务。由于他使用new
来创建Service
我需要对两个子服务使用new
,因此我将能够创建它。所以我不能在这些子服务中注入一些属性。实际上,我正在创建整个对象子树,而不是guicified。
周围有办法吗?我可以让Guice为我实例化Service
然后在TypeListener
注册吗?
答案 0 :(得分:2)
您实际上可以使用getProvider
(Binder和AbstractModule)从模块内访问注入商品的提供商,只要您保证不会拨打{{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
中的实例共享单例行为。您还可以阅读有关createChildInjector和binding resolution order的更多信息。