依赖注入模块初始化顺序中 Dev & Prod 模式的区别
Difference between Dev & Prod modes in dependency injection modules initialization order
我有一个 Play 应用程序,我正在使用 DI 的 Play 库,开箱即用的 Guice。
我正在定义的一些播放模块相互依赖,为了让它们能够将一个的绑定注入另一个,我试图在全局中保留对播放注入器的引用地点,即
class MyApplicationLoader extends GuiceApplicationLoader() {
override def builder(context: ApplicationLoader.Context):
GuiceApplicationBuilder = {
val builder = super.builder(context)
Global.Injector = builder.injector()
builder
}
}
这在 Play 在开发模式下运行时运行良好,但在生产模式下,调用 Global.Injector = builder.injector()
会导致循环依赖,因为它调用需要 Global.Injector
初始化的模块和绑定,但它不是此时尚未初始化。
我理解这可能与以下事实有关:在 Dev 模式下,eager 单例首先被初始化,而在 Production 模式下,eager 单例和常规单例一起初始化。
- 我理解的对吗?
- 我的方法有效吗?如何解决生产模式下的问题?
I'm trying to keep a reference to the Play injector in a Global place
在大多数情况下这应该是不必要的,您应该尽量避免它。
为了解决你的问题,看起来你只需要使用 Provides 注释,一个简单的例子是这样的:
class MyModule extends AbstractModule {
@Provides
def complexConstructor(a: ObjA, b: ObjB): ComplexClass = ???
}
这种方法应该没有任何问题。
我有一个 Play 应用程序,我正在使用 DI 的 Play 库,开箱即用的 Guice。
我正在定义的一些播放模块相互依赖,为了让它们能够将一个的绑定注入另一个,我试图在全局中保留对播放注入器的引用地点,即
class MyApplicationLoader extends GuiceApplicationLoader() {
override def builder(context: ApplicationLoader.Context):
GuiceApplicationBuilder = {
val builder = super.builder(context)
Global.Injector = builder.injector()
builder
}
}
这在 Play 在开发模式下运行时运行良好,但在生产模式下,调用 Global.Injector = builder.injector()
会导致循环依赖,因为它调用需要 Global.Injector
初始化的模块和绑定,但它不是此时尚未初始化。
我理解这可能与以下事实有关:在 Dev 模式下,eager 单例首先被初始化,而在 Production 模式下,eager 单例和常规单例一起初始化。
- 我理解的对吗?
- 我的方法有效吗?如何解决生产模式下的问题?
I'm trying to keep a reference to the Play injector in a Global place
在大多数情况下这应该是不必要的,您应该尽量避免它。
为了解决你的问题,看起来你只需要使用 Provides 注释,一个简单的例子是这样的:
class MyModule extends AbstractModule {
@Provides
def complexConstructor(a: ObjA, b: ObjB): ComplexClass = ???
}
这种方法应该没有任何问题。