Guice:强制绑定作为提供者注入

时间:2011-08-01 10:31:51

标签: java guice

我正在寻找一种强制某些Guice绑定仅作为提供者注入的方法。例如,当存在类似

的配置时
interface ResultLogger {
    void log(String resultAsString);
}

class ResultLoggerProvider implements Provider<ResultLogger> {
    // ...
}

class ResultDisplayModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(ResultLogger.class).toProvider(ResultLoggerProvider.class);
    }
}

我想有办法配置我的模块,以便像

这样的类
@Singleton
class ResultParser {
    private final Provider<ResultLogger> loggerProvider;

    @Inject
    public ResultParser(Provider<ResultLogger> loggerProvider) {
        this.loggerProvider = loggerProvider;
    }
}

可以很好地注入,但是像

这样的实现
@Singleton
class ResultParser {
    private final ResultLogger resultLogger;

    @Inject
    public ResultParser(ResultLogger resultLogger) {
        this.resultLogger = resultLogger;
    }
}

应该抛出一个RuntimeException,通知开发人员ResultLogger只能通过提供者使用。理想情况下会尽快抛出例外,例如:在喷射器的构造期间。我正在寻找一种使用Guice 3.0中现有API实现此目的的简单方法。

3 个答案:

答案 0 :(得分:4)

也许你根本不应该实现Provider而只是有一个

@Singleton
public class ResultLoggerProvider {
   public ResultLogger get() {...}
   // ...
}

@Singleton
class ResultParser {
   private final ResultLoggerProvider loggerProvider;

   @Inject
   public ResultParser(ResultLoggerProvider loggerProvider) {
      this.loggerProvider = loggerProvider;
   }
}

并删除其他绑定。

答案 1 :(得分:1)

我认为这不是正确的方法。我猜你需要像smt一样

interface ResultLogger {
    void log(String resultAsString);
}
class ResultLoggerWrapper implements ResultLogger {
      @Inject @Named("day") ResultLogger dayLogger;
      @Inject @Named("night") ResultLogger nightLogger;
      public void log(String resultAsString){
           if(isDay()) {
                 dayLogger.log(resultAsString)
           } else {
                 nightLogger.log(resultAsString)
           }
      }
}  

bind(ResultLogger.class).to(ResultLoggerWrapper.class);

答案 2 :(得分:-1)

它应该可以绑定Provider而不是ResultLogger。那是在你的模块中

bind(new TypeLiteral<Provider<ResultLogger>>(){}).to(ResultLoggerProvider.class);