3

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();

}
4

1 回答 1

7

这些不是接口。这些是注释。可以在注解上声明静态信息并对其进行注解。然后,检查注释的代码可以利用此信息。

声明为Qualifier的注释让 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 bean:

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

在这里,a将被解析为Barwhile的实例,b将被解析为Baz.

如果没有限定符注释,CDI API 将无法判断Runnable注入哪个实例。所有值必须完全匹配。

于 2013-05-14T16:01:57.330 回答