2016-10-03 5 views
2

Я использую Guice для инъекции зависимостей, и я немного смущен. В разных упаковках имеются две анкеты Named:Использование именованной инъекции в Guice

com.google.inject.name.Named и javax.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 (игнорируйте глупое имя, устаревшая проблема) не аннотируется.

ответ

4

Как упоминалось в Вики Вики, both work the same. Вы не должны беспокоиться об этом. Также рекомендуется использовать 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 
Смежные вопросы