2012-04-13 4 views
0

Guice обеспечивает два варианта так называемых связывания аннотаций, которые, кажется, действительно ломаются до class- и аннотации на уровне экземпляра:Guice: классовые или уровня экземпляра связывания аннотаций

«класса уровня» :

bind(Service.class).annotatedWith(Red.class).to(RedServiceImpl.class); 

@Red 
public class SomeService implements Service { ... } 

Service redSvc = injector.getInstance(SomeService.class); 

"экземпляра уровня":

bind(Service.class).annotatedWith(Names.named("Blue").to(BlueServiceImpl.class); 
@Blue blueSvc = injector.getInstance(Service.class); 

Когда один метод льготной над другим? Кажется, что аннотации уровня класса более абсолютные/негибкие, чем уровень экземпляра. Плюсы/минусы/оговорки/подводные камни любого метода?

ответ

1

Я не уверен, что понимаю ваш вопрос. Ваше использование аннотаций привязки является нерегулярным. Обычно вы не комментируете локальную переменную или класс, а скорее поля и параметры.

Ваш первый пример кода будет заставляет инжектор возвращать SomeService, но не из-за вашей аннотации или привязки, а потому, что SomeService представляет собой конкретную реализацию. Если бы вы попросили вместо этого:

Service redSvc = injector.getInstance(Service.class); 

Вы получите ошибку:

1) No implementation for com.example.Service was bound. 
    while locating com.example.Service 

Ваш второй пример также неправильно. Если вы используете Names для определения привязки, вы должны использовать @Named для доступа к этой привязке. Использование @Blue приведет к ошибке компилятора. Правильное использование будет @Named(value="Blue").

Распространенное лучшая практика для связывания аннотаций заключается в следующем:

@BindingAnnotation 
@Target({ FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME) 
public @interface MyAnno 

В этом случае, оба они были бы ошибки компиляции:

@Red // not allowed 
public class SomeService implements Service { ... } 

@Blue // not allowed 
blueSvc = injector.getInstance(Service.class); 
0

Единственное реальное отличие состоит в том, что в одном случае вы связываете всю аннотацию, а в другом случае вы связываете аннотацию с конкретными аргументами. Не все аннотации даже принимают аргументы, и в этом случае привязка к классу аннотации совершенно нормальна.

Смежные вопросы