gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:28:40 24 4
gpt4 key购买 nike

我在 @Qualifier 定义中看到了对 values() 的各种引用。我理解 @Qualifier 是一个标记系统,但您将它们定义为一个接口(interface)。

接口(interface)可以允许枚举,但我不理解我在下面列出的两个不相关示例中看到的单词 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();

}

最佳答案

这些不是接口(interface)。这些是 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 的哪个实例。注入(inject)。所有值都必须完全匹配。

关于java - 我在 java 的各种 CDI 限定符中看到的 values() 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com