Guice:将已安装模块中的对象注入到依赖的已安装模块

时间:2013-12-01 00:24:44

标签: dependency-injection guice

我对新Guice很陌生,但在此之前我已经取得了相当的成功。

我有一个'main'Guice模块(ServerModule),如下所示,它安装了其他几个模块:

public class ServerModule extends AbstractModule {

  @Override
  protected void configure() {
    install(new DbModule());
    install(new ModuleA());
    install(new ModuleB());
  }
}

第一个安装的模块(DbModule)如下:

public class DbModule extends AbstractModule {
  @Override
  protected void configure() {
    bind(DbService.class).to(DbServiceImpl.class).asEagerSingleton();
  }
}

我遇到的问题是其他两个模块依赖于DbService创建的DbModule实例。 I.E.我需要将DbService对象注入其他两个已安装的模块(ModuleAModuleB)。

由于ModuleAModuleB不是由注入器创建的(我正在构建它们如上所示),我无法将创建的DbService实例注入这些模块中,甚至无法将它们传递给构造函数。即:

install(new DbModule());    
install(new ModuleA(dbService));
install(new ModuleB(dbService)));

我已经体验过使用提供程序@provider来提供DbService的实例,但是由于我正在手动保管模块,如上所示,它将无法正常工作。

如果我可以让注射器创建ModuleAModuleB,我想我可以将DbService实例注入其中,但我无法弄清楚怎么做。

有没有人对我如何才能最好地完成这项工作有任何想法?

编辑:我忘了提到@provider似乎没有用的原因是因为我需要在ModuleA本身使用DbService,而不是在其中一个绑定中使用:

public class ModuleA extends AbstractModule {
  @Inject
  private DbService dbService;

  @Override
  protected void configure() {
    if( dbService.getX() )
      bind(Y.class);
  }
}

2 个答案:

答案 0 :(得分:2)

你不能也不应该这样做,因为Guice模块不应该以这种方式使用。

基本上,Guice鼓励将配置与实际对象创建分开。除非您创建注入器,使用它来创建新模块,然后使用这些模块创建另一个注入器,否则您无法注入模块。

事实上这非常好。你的模块里面通常不应该有复杂的逻辑,毕竟它只是一个配置。您应该重构您的程序,例如,使用@Provides - 方法或完整的Provider。然后,您将拥有更清晰的依赖配置逻辑。

答案 1 :(得分:2)

你做不到。

创建注射器时会调用Module.configure()方法,注射只能在注射器准备就绪后才能进行。