2013-05-14 3 views
3

хороший день.Каковы значения(), которые я видел в различных квалификаторах CDI в java?

Я видел различные ссылки на значения() внутри определений @qualifier. Я понимаю, что @Qualifier является системой тегов, но вы определяете их как интерфейс.

Интерфейс может разрешать перечисления, но я не понимаю слово «значения()», которое я видел в двух несвязанных примерах, перечисленных ниже.

Не могли бы вы объяснить мне значение слова()?

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

} 

ответ

6

Это не интерфейсы. Это annotations. Можно объявить статическую информацию об аннотациях и аннотировать их. Затем код, который проверяет аннотации, может использовать эту информацию.

Аннотации, обозначенные как Qualifier s let 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 боба:

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

Здесь a будет решен к экземпляру Bar в то время как b будет разрешен экземпляр Baz.

Без аннотации квалификатора API CDI не сможет указать, какой экземпляр Runnable для инъекции. Все значения должны быть точными.

+0

Это все хорошо, но не отвечает на вопрос. «Значения» в аннотации (которая в байтовом коде фактически является специальным типом интерфейса) является именем по умолчанию для члена аннотации. – LightGuard

+0

эй большое спасибо за эту информацию обоим вам. Я должен был понять, что @interface и Interface - это как ключевые слова, так и аннотация. Вау. Легкая ошибка сделать там с одинаковыми именами. И спасибо за объяснение ценностей. – user798719

Смежные вопросы