asEagerSingleton с фабрикой - PullRequest
0 голосов
/ 08 мая 2018

Я очень новичок в Guice, но у меня есть синглтон, который, как я считаю, обычно создается таким образом:

@Provides
@Singleton
private SomeClass getSomeClass()
{
    return someClassFactory(configuration);
}

Однако я хочу, чтобы это было с нетерпением инициализировано. Когда я удаляю аннотацию @Singleton и пытаюсь bind(SomeClass.class).asEagerSingleton(), я получаю ошибки:

 1) No implementation for SomeClass was bound.
 2) A binding to SomeClass was already configured

Как я могу предоставить инициализированный синглтон, созданный с параметрами или фабрикой?

1 Ответ

0 голосов
/ 08 мая 2018

Аннотация @Provides - это отдельный способ настройки привязки для SomeClass; это противоречит привязке bind(SomeClass.class).asEagerSingleton().

Чтобы исправить это, вам нужно написать явный класс провайдера и связать его, используя toProvider:

class MyModule extends AbstractModule {

  private static class MyProvider implements Provider<SomeClass> {
    private final OtherStuff otherStuff;

    @Inject
    MyProvider(OtherStuff otherStuff) {
      // Inject constructor params if your @Provides method took arguments
      this.otherStuff = otherStuff;
    }

    public SomeClass get() {
      return new SomeClass(otherStuff);
    }
  }

  protected void configure() {
    bind(SomeClass.class).toProvider(MyProvider.class).asEagerSingleton();
  }
}
...