GuiceApplicationLoader 配置错误
Posted
技术标签:
【中文标题】GuiceApplicationLoader 配置错误【英文标题】:GuiceApplicationLoader configuration error 【发布时间】:2015-07-01 07:58:14 【问题描述】:所以,我正在尝试使用如下所示的方式实现编译时 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)
....
不明白为什么这不起作用,因为我见过的所有例子都没有做更多的事情。我忽略了什么?
【问题讨论】:
【参考方案1】:使用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)
【讨论】:
【参考方案2】:我不确定您要在这里实现什么,但这不是编译时依赖注入的工作方式。 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
实例。
【讨论】:
这只是一个小例子。我需要根据应用程序是处于 Prod 模式还是 Dev 模式使用不同的绑定(因为我们正在模拟服务,因为它们通常在 Dev 模式下不可用) - 并且最好不需要开发人员手动在不同的 conf 文件之间切换.使用 play.modules.enabled 对此不起作用(至少根据我的理解)。使用 bindings(..) 按我的预期工作,我们可以在 Loader 中设置一个案例来处理不同的案例。 @MichaelA。如果不说核心功能,DI 的优势之一就是无需接触代码即可将应用程序连接在一起。您描述的用例正是 DI 的用途。你读过Additional Configuration吗?以上是关于GuiceApplicationLoader 配置错误的主要内容,如果未能解决你的问题,请参考以下文章
(4.19)SQL server 2008一些常见配置之一(基本配置,权限配置远程访问配置和内存配置。)
Tomcat卷五---Web 应用配置,管理配置和JVM配置
SpringBoot:配置文件的作用配置文件的格式properties配置文件yml配置文件
SpringCloud Nacos配置管理 -- 统一配置管理(添加配置微服务配置拉取)
Android Gradle 插件LintOptions 配置 ⑦ ( explainIssues 属性配置 | htmlOutput 属性配置 | htmlReport 属性配置 )