Я использую 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 инжектора, поэтому я думаю, что я не создаю несколько инжекторов.