2017-07-14 64 views
0

我在Java中發現了以下代碼,解釋瞭如何使用guice很好地將您的配置參數註釋爲帶註釋的字符串參數。 https://github.com/google/guice/wiki/FrequentlyAskedQuestionsScala Guice如何將配置參數注入爲字符串?

我想做同樣的事情,但在斯卡拉。 你會怎麼做?

並注意我正在尋找一個解決方案,使用通用特質/類。東西

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

我看着輔助注射,但無法弄清楚我的問題。

任何幫助將不勝感激。 謝謝

+0

我看到如何做到這一點的唯一方法是使用輔助注射與Foo和FooImpl的工廠特徵和提供我自己的工廠impl。但是這意味着使用toInstance綁定我的工廠(新的FooFactory([我的字符串參數]),並且我不確定它是否可以用於通用... Java中的註釋解決方案看起來更乾淨和更簡單,如果我想在純scala中編寫這個註釋接口怎麼辦?是否有可能? – Jeep87c

回答

1

你會在斯卡拉完全一樣,你會用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;在所有其他方面,它允許您省略這些笨拙的classOf

+0

不可以,但是,爲了滿足我的好奇心,正如我所說的,在Scala中定義具有運行時保留的註釋是不可能的。 –

+0

第一次錯過了這個部分,謝謝指出。 – Jeep87c

相關問題