scala - 依赖注入模块初始化顺序中 Dev 和 Prod 模式的区别
问题描述
我有一个 Play 应用程序,我正在使用 DI 的 Play 库,Guice 开箱即用。
我正在定义的一些播放模块相互依赖,为了让它们能够将一个绑定注入另一个,我试图在全局位置保留对 Play 注入器的引用,即
class MyApplicationLoader extends GuiceApplicationLoader() {
override def builder(context: ApplicationLoader.Context):
GuiceApplicationBuilder = {
val builder = super.builder(context)
Global.Injector = builder.injector()
builder
}
}
这在 Play 在 Dev 模式下运行时效果很好,但在 Production 模式下,调用Global.Injector = builder.injector()
会导致循环依赖,因为它调用需要Global.Injector
初始化的模块和绑定,但此时尚未初始化。
我知道这可能与以下事实有关:在开发模式下,先初始化急切的单例,而在生产模式下,急切的单例和常规单例一起初始化。
- 我理解正确吗?
- 我的方法有效吗?如何解决生产模式下的问题?
解决方案
我正在尝试在全局位置保留对 Play 注入器的引用
在大多数情况下,这应该是不必要的,您应该尽量避免它。
为了解决你的问题,看起来你只需要使用提供注释,一个简单的例子是这样的:
class MyModule extends AbstractModule {
@Provides
def complexConstructor(a: ObjA, b: ObjB): ComplexClass = ???
}
这种方法应该没有任何问题。
推荐阅读
- xml - 找不到元素“汽车”的声明
- amazon-web-services - 如何在 AWS LightSail Linux 实例上打开端口 25
- android - 从 Android 中的 Firebase 实时数据库中检索数据 - recyclerview
- list - 如何应用断言条件来更改列表?
- python - 如何从字符串而不是文档字符串运行 doctest 示例?为什么需要缩进?
- html - 为什么 iframe 不继承父级的样式?
- javascript - 如何在 socket.io 上获取 https
- azure - 如何在 Azure 数据工厂中获取管道文件夹路径?
- go - 在golang中获取数组的长度并将其存储在const中
- c# - 相机中的 UnassignedReferenceException