© DrHitch/Shutterstock.com
Shortcuts
CDI

5 Qualifier


Wie oben dargestellt wurde, muss die Injektion eines CDI-Objekts eindeutig auflösbar sein, d. h. bislang darf es nur genau eine CDI Bean mit passendem Bean Type geben. Das wäre in der Praxis doch zu einschränkend. CDI bietet aber die Möglichkeit an, Mehrdeutigkeiten in der Bean-Zuordnung mithilfe sog. Qualifier zu lösen. Darunter versteht man Annotationen, die ihrerseits mit @Qualifier (javax.inject.Qualifier) annotiert sind (Listing 5.1).

@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface Formal
{
}

Listing 5.1: Ein einfacher Qualifier

Qualifier können nun bei der Definition einer CDI Bean als Annotationen verwendet werden. Eine Bean ohne selbstdefinierte Qualifier erhält automatisch den vordefinierten Qualifier @Default (javax.enterprise.inject.Default) zugeordnet (Listing 5.2).

// Implizit: @Default
public class GreetingBean
{

}

@Formal
public class FormalGreetingBean extends GreetingBean
{

}

Listing 5.2: Implizite und explizite Angabe eines Qualifiers bei der Bean-Definition

Zusätzlich bekommt jede Bean den ebenfalls vordefinierten Qualifier @Any. Er spielt später bei einem programmgesteuerten Zugriff auf CDI Beans eine Rolle. Hier können wir ihn zunächst einmal ignorieren.

Bei der Injektion von CDI Beans können wiederum Qualifier angegeben werden. Hier gilt @Default implizit als angegeben, wenn kein anderer Qualifier verwendet wird. Eine zur Injektionsstelle passende Bean muss mindestens die angegebenen Qualifier besitzen (Listing 5.3).

// Injektion eines FormalGreetingBean-Objektes
@Inject @Formal
private GreetingBean greetingBean;

// Injektion eines GreetingBean-Objektes
@Inject
private GreetingBean greetingBean2;

// Deployment-Fehler: Keine Bean mit *beiden* Qualifiern
// vorhanden
@Inject @Formal @Default
private GreetingBean greetingBean3;

Listing 5.3: Qualifier-Nutzung zur Auswahl injizierter Objekte

Bei Injektion in Methoden- oder Konstruktorparameter gehören die Qualifier zu den Parametern (Listing 5.4).

@Inject
private void setGreetingBean(@Formal GreetingBean bean)
{

Listing 5.4: Qualifier bei der Injektion in Methodenparameter

Qualifier geben uns also die Möglichkeit der Auswahl zwischen mehreren Varianten eines Dienstes o. ä., indem für jede Variante eine entsprechende Annotation bereitgestellt wird. Das kann ein wenig lästig werden, wenn nicht nur einzelne Varianten zur Verfügung gestellt werden sollen, sondern eine größere Anzahl. Für einen solchen Fall können Qualifier mit Parametern versehen werden, die bei d...

Shortcuts
CDI

5 Qualifier

Wie oben dargestellt wurde, muss die Injektion eines CDI-Objekts eindeutig auflösbar sein, d. h. bislang darf es nur genau eine CDI Bean mit passendem Bean Type geben. Das wäre in der Praxis doch zu einschränkend. CDI bietet aber die Möglichkeit an, Mehrdeutigkeiten in der Bean-Zuordnung mithilfe sog. Qualifier zu lösen. Darunter versteht man Annotationen, die ihrerseits mit @Qualifier (javax.inject.Qualifier) annotiert sind (Listing 5.1).

Shortcut Autorenteam


Wie oben dargestellt wurde, muss die Injektion eines CDI-Objekts eindeutig auflösbar sein, d. h. bislang darf es nur genau eine CDI Bean mit passendem Bean Type geben. Das wäre in der Praxis doch zu einschränkend. CDI bietet aber die Möglichkeit an, Mehrdeutigkeiten in der Bean-Zuordnung mithilfe sog. Qualifier zu lösen. Darunter versteht man Annotationen, die ihrerseits mit @Qualifier (javax.inject.Qualifier) annotiert sind (Listing 5.1).

@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface Formal
{
}

Listing 5.1: Ein einfacher Qualifier

Qualifier können nun bei der Definition einer CDI Bean als Annotationen verwendet werden. Eine Bean ohne selbstdefinierte Qualifier erhält automatisch den vordefinierten Qualifier @Default (javax.enterprise.inject.Default) zugeordnet (Listing 5.2).

// Implizit: @Default
public class GreetingBean
{

}

@Formal
public class FormalGreetingBean extends GreetingBean
{

}

Listing 5.2: Implizite und explizite Angabe eines Qualifiers bei der Bean-Definition

Zusätzlich bekommt jede Bean den ebenfalls vordefinierten Qualifier @Any. Er spielt später bei einem programmgesteuerten Zugriff auf CDI Beans eine Rolle. Hier können wir ihn zunächst einmal ignorieren.

Bei der Injektion von CDI Beans können wiederum Qualifier angegeben werden. Hier gilt @Default implizit als angegeben, wenn kein anderer Qualifier verwendet wird. Eine zur Injektionsstelle passende Bean muss mindestens die angegebenen Qualifier besitzen (Listing 5.3).

// Injektion eines FormalGreetingBean-Objektes
@Inject @Formal
private GreetingBean greetingBean;

// Injektion eines GreetingBean-Objektes
@Inject
private GreetingBean greetingBean2;

// Deployment-Fehler: Keine Bean mit *beiden* Qualifiern
// vorhanden
@Inject @Formal @Default
private GreetingBean greetingBean3;

Listing 5.3: Qualifier-Nutzung zur Auswahl injizierter Objekte

Bei Injektion in Methoden- oder Konstruktorparameter gehören die Qualifier zu den Parametern (Listing 5.4).

@Inject
private void setGreetingBean(@Formal GreetingBean bean)
{

Listing 5.4: Qualifier bei der Injektion in Methodenparameter

Qualifier geben uns also die Möglichkeit der Auswahl zwischen mehreren Varianten eines Dienstes o. ä., indem für jede Variante eine entsprechende Annotation bereitgestellt wird. Das kann ein wenig lästig werden, wenn nicht nur einzelne Varianten zur Verfügung gestellt werden sollen, sondern eine größere Anzahl. Für einen solchen Fall können Qualifier mit Parametern versehen werden, die bei d...

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang