【问题标题】:Scala Guice how to inject configuration parameter as string?Scala Guice 如何将配置参数作为字符串注入?
【发布时间】:2017-07-14 18:06:56
【问题描述】:

我在 Java 中找到了以下代码,解释了如何使用 guice 将配置参数很好地注入为带注释的字符串参数。 https://github.com/google/guice/wiki/FrequentlyAskedQuestions

我想在 scala 中做同样的事情。 你会怎么做?

请注意,我正在寻找使用通用特征/类的解决方案。一些东西

trait Foo[T <- SomeOtherType] {}
class FooImpl[T <- SomeOtherType](val url: String) extend Foo[T] {}

我研究了辅助注射,但无法解决我的问题。

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 我看到如何做到这一点的唯一方法是使用带有工厂特征的辅助注入 Foo 和 FooImpl 并提供我自己的工厂实现。但这意味着使用 toInstance(new FooFactory([my string params]) 绑定我的工厂。而且我仍然不确定它是否适用于泛型... Java 中的注释解决方案看起来更简洁。但无法确定解决这个问题。

标签: scala guice


【解决方案1】:

您可以在 Scala 中执行此操作,就像在 Java 中执行此操作一样。首先,定义一个注解:

/**
 * Annotates the URL of the foo server.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@BindingAnnotation
public @interface FooServerAddress {}

注意这是Java代码;你不能在 Scala 中定义运行时注解。

然后你绑定一个用这个注解注解的常量:

bindConstant().annotatedWith(classOf[FooServerAddress])

最后,你注入它:

class FooImpl[T] @Inject() (@FooServerAddress val url: String) extends Foo[T] {}

目标类的通用性在这里并不重要。

另外,如果您将 Guice 与 Scala 一起使用,请考虑使用 scala-guice;除此之外,它还允许您省略这些笨拙的classOfs。

【讨论】:

  • 感谢您的回答。我刚试了一下,效果很好。但是,为了满足我的好奇心,如果我想用纯scala编写这个注释接口怎么办?有可能吗?
  • 不,正如我所说,在 Scala 中无法定义具有运行时保留的注释。
猜你喜欢
  • 2015-08-28
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多