Guice Singleton создан несколько раз в одном модуле - PullRequest
0 голосов
/ 12 декабря 2018

Я использую Guice через Play на Java.Мой класс помечен как @Singleton:

import com.google.inject.Singleton;

@Singleton
@Slf4j
public class HistoryService {
    @Inject
    public HistoryService(Configuration configuration) {
        log.error("I am being created");
    }
}

Мой модуль регистрирует некоторые привязки:

@Override
protected void configure() {
    super.configure();

    bind(Flows.class).toProvider(FlowConfigProducer.class);
    bind(FlowManager.class).asEagerSingleton();

    bind(ApplicationLifecycle.class).to(AppLifecycleHandler.class).asEagerSingleton();

    bindService(FileService.class, FileServiceImpl.class);
}

Есть некоторые зависимости, которые могут быть интересны:

  • FlowManager внедряет HistoryService в своем конструкторе
  • AppLifecycleHandler внедряет FlowManager в своем конструкторе (и поэтому косвенно HistoryService)

Я заметил, чтоI am being created печатается дважды и в соответствии с трассировкой стека один раз, когда создается экземпляр AppLifecycleHandler, и один раз, когда создается FlowManager (в этом порядке, поскольку FlowManager является зависимостью AppLifecycleHandler).

Теперь первая проблема заключается в том, что FlowManager создается несколько раз.Это связано как eagerSingleton.То же самое касается моего HistoryService.Его не следует создавать несколько раз.

Я также пытался зарегистрировать HistoryService в модуле с помощью bind(HistoryService.class).in(Singleton.class) или bind(HistoryService.class).asEagerSingleton(), но безрезультатно.Это всегда создает два экземпляра моего сервиса.Что вызывает это?

EDIT : Поскольку я обнаружил вопрос о том, что добавление in(Scopes.SINGLETON) устранило их проблему, я также попытался, но это ничего не изменило, и IntelliJ уже отметилчто его избыточно указывать, что.

EDIT2 :

Вот конструкторы:

@Inject
FlowManager(ActorSystem actorSystem, HistoryService historyService, Configuration configuration) {
    this.materializer = ActorMaterializer.create(actorSystem);
    this.historyService = historyService;
    this.tempFolder = configuration.getString("application.temp-folder", Option.empty()).get();
}


@Inject
AppLifecycleHandler(FlowManager flowManager, Injector injector) {
    this.flowManager = flowManager;
    this.injector = injector;
}

Инжекторы были упомянуты в комментариях, однакопо крайней мере, в соответствии с документацией, получение инжектора Guice в Play должно выполняться с помощью DI инжектора, поэтому я думаю, что я не создаю несколько инжекторов.

...