java - 创建注入(inject)类的实例时如何注入(inject)配置实例?

标签 java scala dependency-injection guice

我的情况很简单:

class MyClass @Inject() (configuration: Configuration) {

    val port = configuration.get[String]("port")

    ...

}

现在我想在其他对象中使用 MyClass:

object Toyota extends Car {

  val myClass = new MyClass(???)

  ...

}

但我不知道当我使用 MyClass 时如何为其提供我注释的配置实例,该实例将在实例化 MyClass 时注入(inject)。

我正在使用 play2.6/juice/scala

谢谢!

最佳答案

首先,您应该确定依赖注入(inject)是否确实是您所需要的。 DI 的基本思想:不是工厂或对象本身创建新对象,而是从外部传递依赖项,并将实例化问题传递给其他人。

如果您依赖框架,您应该全力以赴,这就是为什么无法将 new 与 DI 一起使用的原因。您无法将类传递/注入(inject)到 scala 对象中,以下是您可以执行的操作的草稿:

游戏/指导需要一些准备。

注入(inject)模块告诉 guice 如何创建对象(如果您无法通过注释执行此操作,或者想在一个地方执行此操作)。

class InjectionModule extends AbstractModule {
  override def configure() = {
    // ...
    bind(classOf[MyClass])
    bind(classOf[GlobalContext]).asEagerSingleton()
  }
}

注入(inject)注入(inject)器以便能够访问它。

class GlobalContext @Inject()(playInjector: Injector) {
  GlobalContext.injectorRef = playInjector
}

object GlobalContext {
  private var injectorRef: Injector = _

  def injector: Injector = injectorRef
}

指定要启用的模块,因为可以有多个模块。

// application.conf
play.modules.enabled += "modules.InjectionModule"

最后是客户端代码。

object Toyota extends Car {

  import GlobalContext.injector

  // at this point Guice figures out how to instantiate MyClass, create and inject all the required dependencies
  val myClass = injector.instanceOf[MyClass]

  ...

}

通过框架帮助扩展的简单情况。所以,你真的应该考虑其他的可能性。在您的情况下,也许将配置作为隐式参数传递会更好?

对于使用 guice 的依赖注入(inject),请看一下: ScalaDependencyInjection with playGuice wiki

关于java - 创建注入(inject)类的实例时如何注入(inject)配置实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44814304/

相关文章:

java - 序列化 List<Object> 时未发现序列化程序错误

java - 具有多个输入字段的 HTML 表单

scala - Slick 3 Transactions with logic in Scala

spring - 使用依赖注入(inject)时,如何忽略缺失的属性?

java - Spring 限定符和属性占位符

java - Solr 异常 java & solr 初学者

java - 带有数据库的Java桌面应用程序

scala - Slick 3.0.0 执行查询

scala - Scala 构造函数和枚举的问题

java - 如何在Java主类中使用DAO模块?