簡體   English   中英

在 Guice 中使用命名注入

[英]Using named injection in Guice

我正在使用 Guice 進行依賴注入,但我有點困惑。 在不同的包中有兩個Named注釋:

com.google.inject.name.Namedjavax.inject.Named (JSR 330?)。

我渴望依賴javax.inject.* 代碼示例:

import javax.inject.Inject;
import javax.inject.Named;

public class MyClass
{
    @Inject
    @Named("APrefix_CustomerTypeProvider")
    private CustomerTypeProvider customerTypeProvider;
}

在我的命名模塊中,我可能有以下行:

bind(CustomerTypeProvider.class).annotatedWith(...).toProvider(CustomerTypeProviderProvider.class);

問題:我很好奇我應該把點放在什么地方? 我希望像com.google.inject.name.Names.named("APrefix_CustomerTypeProvider")這樣的東西,但是這個返回com.google.inject.name.Named而我需要javax.inject那個。

CustomerTypeProviderProvider.class.getAnnotation(javax.inject.Named.class)也不太適合,因為CustomerTypeProviderProvider (忽略愚蠢的名稱,遺留問題)沒有注釋。

正如在 Guice wiki 上提到的,兩者的工作方式相同 你不應該擔心這個。 甚至建議在可用時使用javax.inject.* ,就像您喜歡的那樣(同一頁面的底部)。

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.name.Names;
import javax.inject.Inject;

public class Main {
  static class Holder {
    @Inject @javax.inject.Named("foo")
    String javaNamed;
    @Inject @com.google.inject.name.Named("foo")
    String guiceNamed;
  }

  public static void main(String[] args) {
    Holder holder = Guice.createInjector(new AbstractModule(){
      @Override
      protected void configure() {
        // Only one injection, using c.g.i.Names.named("").
        bind(String.class).annotatedWith(Names.named("foo")).toInstance("foo");
      }

    }).getInstance(Holder.class);
    System.out.printf("javax.inject: %s%n", holder.javaNamed);
    System.out.printf("guice: %s%n", holder.guiceNamed);
  }
}

印刷:

java.inject: foo
guice: foo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM