使用setter函数实现注入

时间:2010-06-18 13:34:57

标签: java scala dependency-injection

我正在尝试将Scala用作现有Java应用程序的一部分,现在我遇到了一个使用setter方法注入的依赖项的问题(在这部分代码中没有DI框架)。如何以Scala方式处理?

在Scala中,valvar都需要在声明时进行初始化,但我不能这样做,因为Java setter会注入实现某个接口的对象,并且接口是抽象的,不能是实例

class ScalaLogic {
  var service  // How to initialize?

  def setService (srv: OutputService) = {
  service = srv
}

有没有办法初始化var service以便以后可以为其分配依赖项?它应该是词法范围,以便在整个班级中可见。

3 个答案:

答案 0 :(得分:5)

您可以使用下划线初始化为默认值(null)。

class ScalaLogic {
  var service: OutputService = _

  def setService (srv: OutputService) = {
    service = srv
  }
}

下划线的优点(与使用null相反)是它适用于基元和对象,因此参数化类的工作方式如下:

class ScalaLogic[T] {
  var service: T = _

  def setService (srv: T) = {
    service = srv
  }
}

答案 1 :(得分:3)

下划线的许多含义之一是将变量标记为未初始化。因此,如果您想要一个未初始化的字段,请使用_。

进行初始化

要为字段设置getter和setter,请使用@BeanProperty对其进行注释。编译器将为您生成Java样式的getter和setter。

import reflect.BeanProperty

class ScalaLogic {
  @BeanProperty 
  var service: OutputService = _
}

顺便说一下,Scala中依赖注入的规范引用是summary by Jonas Bonér。但是,如果我没记错的话,本文不涉及基于setter的注射。

答案 2 :(得分:2)

尝试使用课程Option。这是在Java中使用null的道德等价物。像这样声明服务:

var service: Option[MyInterface] = None

并使用

service.get()

或模式匹配

service match {
    case None => ...
    case Some[MyInterface] => ...
}