каковы значения(), которые я видел в различных квалификаторах CDI в java?

Я видел различные ссылки на values() внутри @Qualifier определений. Я понимаю, что @Qualifier — это система тегов, но вы определяете их как интерфейс.

Интерфейс может разрешать перечисления, но я не понимаю слово values(), которое я видел в двух несвязанных примерах, которые я перечислил ниже.

Не могли бы вы объяснить мне значение слова values()?

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface NumberOfDigits {
    Digits value();
}

public enum Digits {
    TWO,
    EIGHT,
    TEN,
    THIRTEEN
}

package com.byteslounge.bean;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.inject.Qualifier;

@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface MessageTransport {

  MessageTransportType value();

}

person user798719    schedule 14.05.2013    source источник


Ответы (1)


Это не интерфейсы. Это аннотации. В аннотациях можно объявлять статическую информацию и аннотировать их. Затем код, проверяющий аннотации, может использовать эту информацию.

Аннотации, объявленные как Квалификаторы, позволяют CDI устранить неоднозначность между реализациями одного типа.

Рассмотрим квалификатор Foo:

@Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD})
public @interface Foo { int value(); }

Типы, отмеченные Foo:

@Foo(1) public class Bar implements Runnable {
   //...impl

@Foo(2) public class Baz implements Runnable {
   //...impl

Компонент CDI:

public class Bean {
  @Inject @Foo(1) Runnable a;
  @Inject @Foo(2) Runnable b;
  //...impl

Здесь a будет преобразовано в экземпляр Bar, а b будет преобразовано в экземпляр Baz.

Без аннотации квалификатора API CDI не смог бы определить, какой экземпляр Runnable следует внедрить. Все значения должны совпадать.

person McDowell    schedule 14.05.2013
comment
Это все хорошо, но не отвечает на вопрос. значения в аннотации (которая в байткоде на самом деле является особым типом интерфейса) — это имя члена аннотации по умолчанию. - person LightGuard; 15.05.2013
comment
эй большое спасибо за эту информацию вам обоим. Я должен был понять, что @interface и Interface — это и ключевые слова, и аннотация. Ух ты. Легкая ошибка сделать там с одинаковыми именами. И спасибо за объяснение значений. - person user798719; 17.05.2013