没有注射器的Guice注射

时间:2019-05-08 11:18:34

标签: java dependency-injection guice

下面是我的模块类

public class ABCModule extends AbstractModule {

    @Override
    protected void configure() {
        install(new JpaPersistModule(Configuration.get("error-persister")));
        bind(DBService.class).to(DBServiceImpl.class).in(Singleton.class);
        bind(DBRepository.class).to(DBRepositoryImpl.class).in(Singleton.class);
    }

    @ProvidesIntoOptional(ProvidesIntoOptional.Type.ACTUAL)
    public ErrorHandler getErrorHandler() {
        return new ABCHandler();
    }
}

而ABCHandler有

private final DBService dbService;

@Inject
public ABCHandler() {
    Injector injector = Guice.createInjector(new ABCModule());
    injector.getInstance(PersistenceInitializer.class);
    this.dbService = injector.getInstance(DBService.class);
}

@Override
public void handle() {
    dbService.store("abc");
}

ABCModule实例被创建并传递给某个通用模块。如您所见,ABCModule提供了ABCHandlerABCHandler再次使用ABCModule创建了注入程序和服务实例。它有效,但是我知道这是不正确的。 Module被调用了两次。如何在dbService内注入ABCHandler,而不必使用注入器或创建模块实例。我不想创建一个虚拟的空模块只是为了创建实例。你能建议一下吗?如果我仅在@Inject上使用dbService而不使用注入器,则它为null。我在Provider内使用Module,可以为dbService做类似的事情。或其他解决方案?

1 个答案:

答案 0 :(得分:2)

DbService已经可以注射,您可以通过getErrorHandler方法传递

  @ProvidesIntoOptional(ProvidesIntoOptional.Type.ACTUAL)
  public ErrorHandler getErrorHandler(DBService dbService) {
    return new ABCHandler(dbService);
  }

在这种情况下,ABCHandler构造函数可以更改为此

  @Inject
  public ABCHandler(DBService dbService) {
    this.dbService = dbService;
  }

更多详细信息,请点击这里 Accessing Guice injector in its Module?