© DrHitch/Shutterstock.com
Shortcuts
CDI

14 Programmgesteuerter Zugriff auf CDI Beans


Die bislang besprochenen Injektionsmöglichkeiten sind zweifellos in den meisten Fällen genau die Mittel der Wahl. Es gibt aber auch Situationen, in den man mehr eigene Kontrolle über die Auswahl und Nutzung von CDI Beans benötigt, um z. B. bestimmte Beans dynamisch auszuwählen, alle Beans eines bestimmten Typs aufzurufen etc. CDI bietet dazu einerseits eine Injektionsmöglichkeit für alle verfügbaren Instanzen einer Bean und andererseits den Zugriff auf den zentralen Bean Manager.

Injektion von Bean-Instanzen

Mithilfe des Interface Instance<T> (javax.enterprise.inject.Instance) können alle verfügbaren Beans eines Bean Type, die zu einer gegebenen Menge von Qualifiern passen, in eine CDI Bean injiziert werden. Die Instanziierung der gefundenen Beans geschieht mithilfe der Methode Instance.get, wenn nur eine Bean gefunden wurde. Andernfalls kann über die Beans iteriert werden.

public class BeanModel
{
@Inject @Any
private Instance<GreetingBean> greetingBeans
;

public List<Class<?>> getGreetingBeanClasses()
{
for (GreetingBean bean : this.greetingBeans)
{

Listing 14.1: Injektion ggf. mehrerer Beans

Instance bietet die Methoden isAmbiguous und isUnsatisfied an, mit denen festgestellt werden kann, ob die Bean-Menge mehrdeutig bzw. leer ist. Darüber hinaus kann mit select die gefundene Bean-Menge weiter reduziert werden. select erhält dazu die gewünschten Annotationen als Parameter. Leider ist es in Java etwas umständlich, Annotationen im Programm zu instanziieren. Als kleine Hilfe bietet CDI dazu das Interface AnnotationLiteral<T> (javax.enterprise.util.AnnotationLiteral) an, das entweder direkt inline zur Instantiierung von Annotation-Objekten (new AnnotationLiteral<Any>(){}) oder zur Definition von Annotations-Literal-Klassen genutzt werden kann (Listing 14.2).

public class FormalLiteral extends AnnotationLiteral<Formal>
implements Formal
{
}

Listing 14.2: Klasse für Literale der Annotation „@Formal“

Im Beispiel wird eine Literalklasse für die Annotation @Formal gezeigt. Die Implementierung von Formal ist hier eigentlich überflüssig, da @Formal keine Attribute besitzt. Andernfalls müssten die entsprechenden Methoden mit aufgenommen oder die Klasse abstract gemacht werden.

Objekte solcher Literalklassen können dann als Parameter für Instance.select verwendet werden. Das Ergebnis des Methodenaufrufs ist die auf die angegebenen Qualifier eingeschränkte Bean-Menge (Listing 14.3).

public class BeanModel
{
@Inject @Any
private Instance<GreetingBean> greetingBeans;

pub...
Shortcuts
CDI

14 Programmgesteuerter Zugriff auf CDI Beans

Die bislang besprochenen Injektionsmöglichkeiten sind zweifellos in den meisten Fällen genau die Mittel der Wahl. Es gibt aber auch Situationen, in den man mehr eigene Kontrolle über die Auswahl und Nutzung von CDI Beans benötigt, um z. B. bestimmte Beans dynamisch auszuwählen, alle Beans eines bestimmten Typs aufzurufen etc. CDI bietet dazu einerseits eine Injektionsmöglichkeit für alle verfügbaren Instanzen einer Bean und andererseits den Zugriff auf den zentralen Bean Manager.

Shortcut Autorenteam


Die bislang besprochenen Injektionsmöglichkeiten sind zweifellos in den meisten Fällen genau die Mittel der Wahl. Es gibt aber auch Situationen, in den man mehr eigene Kontrolle über die Auswahl und Nutzung von CDI Beans benötigt, um z. B. bestimmte Beans dynamisch auszuwählen, alle Beans eines bestimmten Typs aufzurufen etc. CDI bietet dazu einerseits eine Injektionsmöglichkeit für alle verfügbaren Instanzen einer Bean und andererseits den Zugriff auf den zentralen Bean Manager.

Injektion von Bean-Instanzen

Mithilfe des Interface Instance<T> (javax.enterprise.inject.Instance) können alle verfügbaren Beans eines Bean Type, die zu einer gegebenen Menge von Qualifiern passen, in eine CDI Bean injiziert werden. Die Instanziierung der gefundenen Beans geschieht mithilfe der Methode Instance.get, wenn nur eine Bean gefunden wurde. Andernfalls kann über die Beans iteriert werden.

public class BeanModel
{
@Inject @Any
private Instance<GreetingBean> greetingBeans
;

public List<Class<?>> getGreetingBeanClasses()
{
for (GreetingBean bean : this.greetingBeans)
{

Listing 14.1: Injektion ggf. mehrerer Beans

Instance bietet die Methoden isAmbiguous und isUnsatisfied an, mit denen festgestellt werden kann, ob die Bean-Menge mehrdeutig bzw. leer ist. Darüber hinaus kann mit select die gefundene Bean-Menge weiter reduziert werden. select erhält dazu die gewünschten Annotationen als Parameter. Leider ist es in Java etwas umständlich, Annotationen im Programm zu instanziieren. Als kleine Hilfe bietet CDI dazu das Interface AnnotationLiteral<T> (javax.enterprise.util.AnnotationLiteral) an, das entweder direkt inline zur Instantiierung von Annotation-Objekten (new AnnotationLiteral<Any>(){}) oder zur Definition von Annotations-Literal-Klassen genutzt werden kann (Listing 14.2).

public class FormalLiteral extends AnnotationLiteral<Formal>
implements Formal
{
}

Listing 14.2: Klasse für Literale der Annotation „@Formal“

Im Beispiel wird eine Literalklasse für die Annotation @Formal gezeigt. Die Implementierung von Formal ist hier eigentlich überflüssig, da @Formal keine Attribute besitzt. Andernfalls müssten die entsprechenden Methoden mit aufgenommen oder die Klasse abstract gemacht werden.

Objekte solcher Literalklassen können dann als Parameter für Instance.select verwendet werden. Das Ergebnis des Methodenaufrufs ist die auf die angegebenen Qualifier eingeschränkte Bean-Menge (Listing 14.3).

public class BeanModel
{
@Inject @Any
private Instance<GreetingBean> greetingBeans;

pub...

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