© DrHitch/Shutterstock.com
Shortcuts
CDI

8 Producer und Disposer


Die Erzeugung von Objekten mittels Konstruktoraufruf ist nicht immer passend, z. B. wenn die Initialisierung komplexer ist oder nicht immer der gleiche Typ geliefert werden soll. Letzteres passiert regelmäßig, wenn der gewünschte Typ gar keine Klasse, sondern ein Interface ist. In solchen Fällen greift man in Java auf Factory-Methoden zurück. Die CDI-Entsprechung dazu sind Producer Methods.

Producer Methods

Eine CDI Bean kann beliebig viele Producer Methods deklarieren. Das sind nichtabstrakte Methoden – ggf. static – die mit @Produces (javax.enterprise.inject.Produces) annotiert sind. Sie liefern CDI-Objekte zur Injektion in andere Objekte. Der Name der Methode ist zweitrangig, sie muss nicht public sein (Listing 8.1).

public class DatabaseConnectionProducer
{
@Resource(lookup = "jdbc/ee_demos")
private DataSource dataSource;

@Produces
public Connection createConnection()
throws SQLException
{
return this.dataSource.getConnection();
}

Listing 8.1: Producer Method

Das von der Producer-Methode gelieferte Objekt kann wie gewohnt in eine CDI Bean injiziert werden, z. B. so: @Inject private Connection dbConnection;

Dazu wird vom Container zunächst ein Objekt der Producer-Klasse bereitgestellt, falls die Producer Method nicht static ist. Die Producer-Klasse ist eine normale CDI Bean, d. h. alle Mechanismen zur Erzeugung von Beans durch den Container laufen auch hier ab.

Anschließend wird die Producer-Methode aufgerufen. Die Methode darf Exceptions auswerfen. Sollte beim Aufruf durch den Container eine Checked Exception auftreten, wird diese in eine CreationException (javax.enterprise.inject.CreationException) verpackt an den jeweiligen Aufrufer weitergeleitet.

Die Methode kann Qualifier besitzen, die ebenso wie bei anderen CDI Beans bei der Injektion von Werten berücksichtigt werden. Die implizite Zuordnung der Qualifier @Any und @Default geschieht wie bisher.

Der Methode kann auch mittels @Named ein Name zugewiesen werden. Der Default-Name, der bei Verwendung von @Named ohne Parameter vergeben wird, ist der Methodenname oder, falls die Methode eine Getter-Methode im Sinne von JavaBeans ist, der zugehörige Property-Name.

Besitzt eine Producer-Methode Parameter, sind diese Injektionsziele, werden vom Container also per Injektion mit Werten versehen. Parameter des Typs InjectionPoint haben dabei eine besondere Bedeutung. Dies wird weiter unten im Abschnitt „Introspektion des Injektionsziels“ erläutert.

Producer Fields

Eine vereinfachte Variante der Producer Met...

Shortcuts
CDI

8 Producer und Disposer

Die Erzeugung von Objekten mittels Konstruktoraufruf ist nicht immer passend, z. B. wenn die Initialisierung komplexer ist oder nicht immer der gleiche Typ geliefert werden soll. Letzteres passiert regelmäßig, wenn der gewünschte Typ gar keine Klasse, sondern ein Interface ist. In solchen Fällen greift man in Java auf Factory-Methoden zurück. Die CDI-Entsprechung dazu sind Producer Methods.

Shortcut Autorenteam


Die Erzeugung von Objekten mittels Konstruktoraufruf ist nicht immer passend, z. B. wenn die Initialisierung komplexer ist oder nicht immer der gleiche Typ geliefert werden soll. Letzteres passiert regelmäßig, wenn der gewünschte Typ gar keine Klasse, sondern ein Interface ist. In solchen Fällen greift man in Java auf Factory-Methoden zurück. Die CDI-Entsprechung dazu sind Producer Methods.

Producer Methods

Eine CDI Bean kann beliebig viele Producer Methods deklarieren. Das sind nichtabstrakte Methoden – ggf. static – die mit @Produces (javax.enterprise.inject.Produces) annotiert sind. Sie liefern CDI-Objekte zur Injektion in andere Objekte. Der Name der Methode ist zweitrangig, sie muss nicht public sein (Listing 8.1).

public class DatabaseConnectionProducer
{
@Resource(lookup = "jdbc/ee_demos")
private DataSource dataSource;

@Produces
public Connection createConnection()
throws SQLException
{
return this.dataSource.getConnection();
}

Listing 8.1: Producer Method

Das von der Producer-Methode gelieferte Objekt kann wie gewohnt in eine CDI Bean injiziert werden, z. B. so: @Inject private Connection dbConnection;

Dazu wird vom Container zunächst ein Objekt der Producer-Klasse bereitgestellt, falls die Producer Method nicht static ist. Die Producer-Klasse ist eine normale CDI Bean, d. h. alle Mechanismen zur Erzeugung von Beans durch den Container laufen auch hier ab.

Anschließend wird die Producer-Methode aufgerufen. Die Methode darf Exceptions auswerfen. Sollte beim Aufruf durch den Container eine Checked Exception auftreten, wird diese in eine CreationException (javax.enterprise.inject.CreationException) verpackt an den jeweiligen Aufrufer weitergeleitet.

Die Methode kann Qualifier besitzen, die ebenso wie bei anderen CDI Beans bei der Injektion von Werten berücksichtigt werden. Die implizite Zuordnung der Qualifier @Any und @Default geschieht wie bisher.

Der Methode kann auch mittels @Named ein Name zugewiesen werden. Der Default-Name, der bei Verwendung von @Named ohne Parameter vergeben wird, ist der Methodenname oder, falls die Methode eine Getter-Methode im Sinne von JavaBeans ist, der zugehörige Property-Name.

Besitzt eine Producer-Methode Parameter, sind diese Injektionsziele, werden vom Container also per Injektion mit Werten versehen. Parameter des Typs InjectionPoint haben dabei eine besondere Bedeutung. Dies wird weiter unten im Abschnitt „Introspektion des Injektionsziels“ erläutert.

Producer Fields

Eine vereinfachte Variante der Producer Met...

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