0

在 Spring 框架和 Java 世界中,我使用了一种有趣的对象收集器模式。例如考虑下面 -

public interface Calculator {
    SomeOutput calculate(SomeInput input);
}

@Component
public class CalImpl1 implements Calculator {
 public SomeOutput calculate(SomeInput input){
  //some implementation
 }
}

@Component
public class CalImpl2 implements Calculator {
 public SomeOutput calculate(SomeInput input){
  //some implementation
 }
}

现在这可以很容易地使用 Spring DI 注入另一个类

@Component
public class Main {

 //This line collects all to implementors of this and set it here.
 @Autowired
 public List<Calculator> calculators;

 //other methods
}

现在的问题是我不确定如何在 scala 中实现相同的目标。我做了一些搜索,发现了 scala 中使用的蛋糕模式(http://loicdescotte.github.io/posts/scala-di/),但这似乎与上面的对象收集器没有相同的效果。我也想遵循我认为在蛋糕模式中被违反的开闭原则,但使用对象收集器我可以轻松实现它。

有没有办法像在 scala 中实现一样实现相同的对象收集器?

4

2 回答 2

0

lighbend activator 中有一些模板在 Play、Akka 和 Scala 应用程序中使用 spring DI 进行说明。请看这个:https ://www.lightbend.com/activator/templates#filter:spring

我没有使用 Spring 作为 DI,我通常使用 Guice(显式使用,因为它是 play framework 2 的默认设置)和 Implicits 参数都作为编译 DI。

样本:

class B

class X(x: Int)(implicit c: B)

//DI - mostly define in main method/application

implicit val c: B = new B
val x = new X(2)
于 2016-10-07T08:11:27.177 回答
0

明确使用java.util.List为我工作。这不是最漂亮的解决方案,但它表明它基本上可以工作。还没有尝试过,但实现一个相应的PropertyEditor你可以坚持使用 Scala 类型。

trait Calculator {
   def calculate(input: SomeInput) : SomeOutput
}

@Component
class CalImpl1 extends Calculator {
    override def calculate(input: SomeInput): SomeOutput = ...
}

@Component
class CalImpl2 extends Calculator {
  override def calculate(input: SomeInput): SomeOutput = ...
}

@Component
class Main @Autowired()(calculators: java.util.List[Calculator]) {
    // or inject field if constructor injection is not desired
    // @Autowired
    // var calculators: java.util.List[Calculator] = _
}

object Main {
    def main(args: Array[String]) = {
        val ctx = new AnnotationConfigApplicationContext("your package name here")
        val main = ctx.getBean(classOf[Main])
        // calculators should now be wired in the returned instance
  }
}
于 2016-10-07T13:47:42.613 回答