4

在我的应用程序中,用户可以在启动程序时在命令行中传递一些参数。在 main(String[] args) 方法中,我用 args4j 解析它们。在下一步中,我创建一个 Injector(我使用 Google Guice),然后获取一个主程序类的实例。命令行参数是我的应用程序的配置设置。我有一个应该存储它们的 MyAppConfig 类。

如何在注入过程中包含这些命令行参数?我的应用程序的不同类依赖于 MyAppConfig,因此必须在几个地方注入。

我想到的唯一解决方案是创建一个 MyAppConfig 提供程序,它具有与命令行参数相对应的静态字段,并在我使用 args4j 解析它们并在使用 Injector 之前设置它们。然后这样的提供者将使用静态字段创建一个 MyAppConfig。但这看起来相当难看。有没有更优雅的方法来做到这一点?

4

1 回答 1

10

因为您负责创建模块实例,所以您可以向它们传递您想要的任何构造函数参数。您在这里所要做的就是创建一个将您的配置作为构造函数参数的模块,然后将其绑定到该模块中。

class YourMainModule() {
  public static void main(String[] args) {
    MyAppConfig config = createAppConfig(); // define this yourself

    Injector injector = Guice.createInjector(
        new ConfigModule(config),
        new YourOtherModule(),
        new YetAnotherModule());

    injector.getInstance(YourApplication.class).run();
  }
}

class ConfigModule extends AbstractModule {
  private final MyAppConfig config;

  ConfigModule(MyAppConfig config) {
    this.config = config;
  }

  @Override public void configure() {
    // Because you're binding to a single instance, you always get the
    // exact same one back from Guice. This makes it implicitly a singleton.
    bind(MyAppConfig.class).toInstance(config);
  }
}
于 2013-10-06T00:20:31.943 回答