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配置文件

IDEA的常用配置,maven配置,git配置操作

SpringCloud Nacos配置管理 -- 统一配置管理(添加配置微服务配置拉取)

Android Gradle 插件LintOptions 配置 ⑦ ( explainIssues 属性配置 | htmlOutput 属性配置 | htmlReport 属性配置 )