如何使用guice注入器使用注释“getInstance”?

时间:2015-02-16 20:49:42

标签: java constructor dependency-injection annotations guice

我使用FileHandler类获取File作为ctor参数。

我想将它用于2个不同的File s。

如何配置进样器每次注入不同的File

getInstance那样将会返回所需的具体实例的annoation?

注释在这里没有帮助,因为如果我把它放在ctor中,那么这个ctor的所有用法仍然会有一个注释。

public class StringFileWriter implements IResponsesStorage {

    File file;

    @Inject
    @Singleton
    public StringFileWriter(@myAnnotation File file) {
        this.file = file;
    }

public class MainModule extends AbstractModule {

    @Override
    protected void configure() {

        File resultBaselineFile = new File(Constants.RESULTS_BASELINE_FILE);
        bind(File.class).annotatedWith(ResultBaselineFile.class).toInstance(resultBaselineFile);

        File logLatencyFile = new File(Constants.LATENCY_FILE);
        bind(File.class).annotatedWith(LatencyLogFile.class).toInstance(logLatencyFile);

修改

主代码调用2个存储库:一个用于日志文件,第二个用于结果文件。每个存储库都有自己的文件处理程序。那就是问题

1 个答案:

答案 0 :(得分:0)

这是所谓的"robot legs" problem的变体。正如上面的评论所述,正确的解决方案实际上取决于决策的位置。

以下是我在这种情况下如何解决这个问题:

public final class StringFileWriter implements IResponsesStorage {
  private final File file;

  // Note: constructor is not annotated with @Inject
  StringFileWriter(File file) {
    this.file = file;
  }

  // ...

}

public final class StringFileWriterModule extends AbstractModule {
  @Override protected void configure() {}

  @Provides
  @Singleton
  @ResultBaselineFile
  StringFileWriter provideResultBaselineFileWriter(
      @ResultBaselineFile File resultBaselineFile) {
    return new StringFileWriter(resultBaselineFile);
  }

  @Provides
  @Singleton
  @LatencyLogFile
  StringFileWriter provideLatencyLogFileWriter(
      @LatencyLogFile File latencyLogFile) {
    return new StringFileWriter(latencyLogFile);
  }
}

然后在注射点你会选择你想要的StringFileWriter

final class MyWorkerClass {
  private final StringFileWriter resultBaselineFileWriter;

  @Inject MyWorkerClass(@ResultBaselineFile StringFileWriter writer) {
    resultBaselineFileWriter = writer;
  }

  // ...
}