Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个模块中多次创建Guice singleton_Java_Dependency Injection_Guice - Fatal编程技术网

Java 在一个模块中多次创建Guice singleton

Java 在一个模块中多次创建Guice singleton,java,dependency-injection,guice,Java,Dependency Injection,Guice,我在Java中通过Play使用Guice。我的类被注释为一个@Singleton: import com.google.inject.Singleton; @Singleton @Slf4j public class HistoryService { @Inject public HistoryService(Configuration configuration) { log.error("I am being created"); } } 我的模块

我在Java中通过Play使用Guice。我的类被注释为一个
@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
    (从而间接地插入
    历史服务
我注意到正在创建的
将被打印两次,并根据堆栈跟踪打印一次,一次是在实例化
AppLifecycleHandler
时,一次是在创建
FlowManager
时(按此顺序,
FlowManager
AppLifecycleHandler
的依赖项)

现在,第一个问题已经是
FlowManager
被多次创建。它被绑定为
singleton
。我的
历史服务也是如此。它不应该被创建多次

我还尝试将模块中的
HistoryService
注册为
bind(HistoryService.class).in(Singleton.class)
bind(HistoryService.class).asagersingleton()
,但没有成功。它总是创建我的服务的两个实例。这是什么原因造成的

编辑:因为我发现一个问题提到在(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喷射器的使用应该使用喷射器的DI完成,因此我认为我没有创建多个喷射器。

请说明如何编写
FlowManager
AppLifecycleHandler
的构造函数。另外,您确定只使用一个注入器吗?我已经添加了构造函数。我不完全确定,因为Play正在连接Guice,所以我在
AppLifecycleHandler
的构造函数中注入了一个注入器,但是这应该会让我从Play获得一个注入器,而不是一个新的注入器。但是给你100分:)。在生命周期处理程序中删除注入的
注入器
,可以修复该问题。所以它确实创建了第二个注入器来注入到我的实例中:(Injecting
com.google.injector.injector
而不是
play.injector.injector
不会导致相同的问题。