Вы можете использовать квалификаторы для предоставления различных реализаций определённого типа бина. Квалификатор — это аннотация, которую вы применяете к бину. Тип квалификатора — это аннотация Java, определённая как @Target({METHOD, FIELD, PARAMETER, TYPE})
и @Retention(RUNTIME)
.
Например, вы можете объявить тип квалификатора @Informal
и применить его к другому классу, который расширяет класс Greeting
. Чтобы объявить этот тип квалификатора, используйте следующий код:
package greetings;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface Informal {}
Затем вы можете определить класс компонента, который расширяет класс Greeting
и использует этот квалификатор:
package greetings;
@Informal
public class InformalGreeting extends Greeting {
public String greet(String name) {
return "Hi, " + name + "!";
}
}
Обе реализации компонента могут теперь использоваться в приложении.
Если вы определяете бин без квалификатора, то он автоматически получает квалификатор @Default
. Неаннотированный класс Greeting
может быть объявлен следующим образом:
package greetings;
import javax.enterprise.inject.Default;
@Default
public class Greeting {
public String greet(String name) {
return "Hello, " + name + ".";
}
}