加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

我在java中的各种CDI限定符中看到的值()是什么?

发布时间:2020-12-15 04:10:15 所属栏目:Java 来源:网络整理
导读:我在@Qualifier定义中看到了对values()的各种引用. 我理解@Qualifier是一个标记系统,但你将它们定义为一个接口. 一个接口可以允许枚举,但我不明白我在下面列出的两个不相关的例子中看到的单词values(). 你可以向我解释一下value()这个词是什么意思吗? @Qual
我在@Qualifier定义中看到了对values()的各种引用.
我理解@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,METHOD})
public @interface MessageTransport {

  MessageTransportType value();

}

解决方法

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

声明为Qualifier的注释允许CDI disambiguate between implementations of the same type.

考虑限定符Foo:

@Qualifier @Retention(RUNTIME) @Target({FIELD,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实例.所有值必须完全匹配.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读