我在values()
定义中看到了对@Qualifier
的各种引用。
我理解@Qualifier
是一个标记系统,但你将它们定义为一个接口。
界面可以允许枚举,但我不理解我在下面列出的两个不相关的例子中看到的values()
这个词。
您能否向我解释一下value()的含义是什么?
@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();
}
答案 0 :(得分:7)
这些不是接口。这些是annotations。可以在注释上声明静态信息并对其进行注释。然后,检查注释的代码可以使用此信息。
声明为Qualifier的注释允许CDI disambiguate between implementations of the same type。
考虑限定符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
将解析为Bar
的实例,而b
将解析为Baz
的实例。
如果没有限定符注释,CDI API将无法分辨注入Runnable
的哪个实例。所有值必须完全匹配。