Java 在一个模块中多次创建Guice singleton
我在Java中通过Play使用Guice。我的类被注释为一个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"); } } 我的模块
@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分:)。在生命周期处理程序中删除注入的注入器
,可以修复该问题。所以它确实创建了第二个注入器来注入到我的实例中:(Injectingcom.google.injector.injector
而不是play.injector.injector
不会导致相同的问题。