use*_*719 3 java qualifiers cdi
我已经看到了对values()内部@Qualifier定义的各种引用.我理解@Qualifier为标记系统,但您将它们定义为接口.
一个界面可以允许枚举,但我不明白values()我在下面列出的两个不相关的例子中看到的这个词.
你可以向我解释一下value()这个词是什么意思吗?
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface NumberOfDigits {
Digits value();
}
public enum Digits {
TWO,
EIGHT,
TEN,
THIRTEEN
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
这些不是接口.这些是注释.可以在注释上声明静态信息并对其进行注释.然后,检查注释的代码可以利用此信息.
声明为限定符的注释允许CDI 在相同类型的实现之间消除歧义.
考虑限定符Foo:
@Qualifier @Retention(RUNTIME) @Target({FIELD, TYPE, METHOD})
public @interface Foo { int value(); }
Run Code Online (Sandbox Code Playgroud)
注释类型Foo:
@Foo(1) public class Bar implements Runnable {
//...impl
@Foo(2) public class Baz implements Runnable {
//...impl
Run Code Online (Sandbox Code Playgroud)
一个CDI bean:
public class Bean {
@Inject @Foo(1) Runnable a;
@Inject @Foo(2) Runnable b;
//...impl
Run Code Online (Sandbox Code Playgroud)
在这里,a将解析为Barwhile 的实例b将被解析为一个实例Baz.
如果没有限定符注释,CDI API将无法分辨Runnable要注入的实例.所有值必须完全匹配.
| 归档时间: |
|
| 查看次数: |
1199 次 |
| 最近记录: |