GuiceApplicationLoader 配置错误
GuiceApplicationLoader configuration error
所以,我正在尝试使用如下所示的方式实现编译时 DI:
package modules
class MyModule extends AbstractModule {
def configure() {
bind(classOf[MyT]).to(classOf[MyTImpl])
}
}
class MyApplicationLoader extends GuiceApplicationLoader {
override protected def builder(context: ApplicationLoader.Context): GuiceApplicationBuilder = {
initialBuilder
.in(context.environment)
.loadConfig(context.initialConfiguration)
.overrides(overrides(context): _*)
.load(new MyModule)
}
}
application.conf 包含一行:
play.application.loader = "modules.MyApplicationLoader"
但是,当我尝试启动应用程序时,出现错误:
ConfigurationException: Guice configuration errors:
1) No implementation for play.api.Application was bound.
while locating play.api.Application
1 error
No source available, here is the exception stack trace:
->com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for play.api.Application was bound.
while locating play.api.Application
1 error
com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1042)
com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1001)
com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051)
....
不明白为什么这行不通,因为我见过的 none 个例子都涉及到更多内容。我忽略了什么?
我不确定你想在这里实现什么,但这不是编译时依赖注入的工作方式。 Guice 在运行时发挥它的魔力。但是,如果您希望在应用程序启动后立即准备好依赖项,请使用预先加载。 Guice 已经提供了所有需要的工具:
我的模块
class MyModule extends AbstractModule {
def configure() {
bind(classOf[MyT]).to(classOf[MyTImpl]).asEagerSingleton()
}
}
application.conf
play.modules.enabled += "modules.MyModule"
因为MyTImpl
将作为单例加载,它必须没有实例绑定数据。想想 scala 术语中的 object
。始终会注入完全相同的 MyTImpl
实例。
使用bindings
代替load
:
class MyApplicationLoader extends GuiceApplicationLoader {
override protected def builder(context: ApplicationLoader.Context): GuiceApplicationBuilder = {
initialBuilder
.in(context.environment)
.loadConfig(context.initialConfiguration)
.overrides(overrides(context): _*)
.bindings(new MyModule)
}
}
所以,我正在尝试使用如下所示的方式实现编译时 DI:
package modules
class MyModule extends AbstractModule {
def configure() {
bind(classOf[MyT]).to(classOf[MyTImpl])
}
}
class MyApplicationLoader extends GuiceApplicationLoader {
override protected def builder(context: ApplicationLoader.Context): GuiceApplicationBuilder = {
initialBuilder
.in(context.environment)
.loadConfig(context.initialConfiguration)
.overrides(overrides(context): _*)
.load(new MyModule)
}
}
application.conf 包含一行:
play.application.loader = "modules.MyApplicationLoader"
但是,当我尝试启动应用程序时,出现错误:
ConfigurationException: Guice configuration errors:
1) No implementation for play.api.Application was bound.
while locating play.api.Application
1 error
No source available, here is the exception stack trace:
->com.google.inject.ConfigurationException: Guice configuration errors:
1) No implementation for play.api.Application was bound.
while locating play.api.Application
1 error
com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1042)
com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1001)
com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1051)
....
不明白为什么这行不通,因为我见过的 none 个例子都涉及到更多内容。我忽略了什么?
我不确定你想在这里实现什么,但这不是编译时依赖注入的工作方式。 Guice 在运行时发挥它的魔力。但是,如果您希望在应用程序启动后立即准备好依赖项,请使用预先加载。 Guice 已经提供了所有需要的工具:
我的模块
class MyModule extends AbstractModule {
def configure() {
bind(classOf[MyT]).to(classOf[MyTImpl]).asEagerSingleton()
}
}
application.conf
play.modules.enabled += "modules.MyModule"
因为MyTImpl
将作为单例加载,它必须没有实例绑定数据。想想 scala 术语中的 object
。始终会注入完全相同的 MyTImpl
实例。
使用bindings
代替load
:
class MyApplicationLoader extends GuiceApplicationLoader {
override protected def builder(context: ApplicationLoader.Context): GuiceApplicationBuilder = {
initialBuilder
.in(context.environment)
.loadConfig(context.initialConfiguration)
.overrides(overrides(context): _*)
.bindings(new MyModule)
}
}