© DrHitch/Shutterstock.com
Shortcuts
CDI

10 Interceptors


Interceptors sind Klassen, die zusätzlichen Programmcode enthalten, der vor und nach einem Aufruf einer Methode einer anderen Klasse ablaufen soll. Sie stellen damit eine Form der aspektorientierten Programmierung im Java-Standard dar. Interceptors dienen häufig der Implementierung eher technischer, klassenübergreifender Aspekte und helfen damit, fachlichen und technischen Programmcode voneinander zu trennen. Häufig genannte Beispiele für technische Aspekte sind Protokollierung oder Transaktionssteuerung.

Die Interceptor-Spezifikation ist ein Anhang zur EJB-Spezifikation [1]. Trotz dieser scheinbaren Verbindung zu EJBs sind Interceptors darin eher übergreifend für die gesamte Plattform beschrieben. Im Folgenden werden sie aber durch die CDI-Brille betrachtet und nur die Eigenschaften berücksichtigt, die in diesem Rahmen relevant sind.

Interceptor Class

Interceptors sind einfache Klassen, die mit @Interceptor (javax.interceptor.Interceptor) annotiert sind und einen parameterlosen Konstruktor besitzen. Darüber hinaus haben sie eine Methode mit der Signatur Object name(InvocationContext) throws Exception, die mit @AroundInvoke (javax.interceptor.AroundInvoke) annotiert ist. Wird der Interceptor einer Methode einer CDI Bean zugeordnet, so umhüllt die AroundInvoke-Methode jeden Aufruf der Bean-Methode (Listing 10.1).

@Interceptor
public class TransactionRequiredInterceptor
implements Serializable
{
@Resource
UserTransaction userTransaction;

@AroundInvoke
public Object manageTransaction(InvocationContext ctx)
throws Exception
{
// Falls schon eine TX aktiv, Methode direkt aufrufen
if (isTransactionActive())
return invocationContext.proceed();

// TX starten
this.userTransaction.begin();

// Bean-Methode aufrufen
Object result = ctx.proceed();

// TX abschliessen
this.userTransaction.commit();

return result;
}
}

Listing 10.1: Grundsätzlicher Aufbau eines Interceptors

Einer Bean-Methode können später durchaus mehrere Interceptors zugeordnet werden, die in der Art einzelner Schichten um die Bean-Methode herum funktionieren. Die Methode InvocationContext.proceed leitet den Aufruf weiter an die nächste Schicht, bis schließlich die Bean-Methode aufgerufen wird. Dadurch kann vor und nach dem Ablauf der Bean-Methode beliebiger Programmcode ausgeführt werden.

Im Beispiel ist ein Interceptor gezeigt, der zur Ausführung einer Methode eine aktive Transaktion sicherstellt. Der Ausschnitt in Listing 10.1 ist allerdings stark vereinfacht: Er enthält keine Behandlung von Exceptions ...

Shortcuts
CDI

10 Interceptors

Interceptors sind Klassen, die zusätzlichen Programmcode enthalten, der vor und nach einem Aufruf einer Methode einer anderen Klasse ablaufen soll. Sie stellen damit eine Form der aspektorientierten Programmierung im Java-Standard dar. Interceptors dienen häufig der Implementierung eher technischer, klassenübergreifender Aspekte und helfen damit, fachlichen und technischen Programmcode voneinander zu trennen. Häufig genannte Beispiele für technische Aspekte sind Protokollierung oder Transaktionssteuerung.

Shortcut Autorenteam


Interceptors sind Klassen, die zusätzlichen Programmcode enthalten, der vor und nach einem Aufruf einer Methode einer anderen Klasse ablaufen soll. Sie stellen damit eine Form der aspektorientierten Programmierung im Java-Standard dar. Interceptors dienen häufig der Implementierung eher technischer, klassenübergreifender Aspekte und helfen damit, fachlichen und technischen Programmcode voneinander zu trennen. Häufig genannte Beispiele für technische Aspekte sind Protokollierung oder Transaktionssteuerung.

Die Interceptor-Spezifikation ist ein Anhang zur EJB-Spezifikation [1]. Trotz dieser scheinbaren Verbindung zu EJBs sind Interceptors darin eher übergreifend für die gesamte Plattform beschrieben. Im Folgenden werden sie aber durch die CDI-Brille betrachtet und nur die Eigenschaften berücksichtigt, die in diesem Rahmen relevant sind.

Interceptor Class

Interceptors sind einfache Klassen, die mit @Interceptor (javax.interceptor.Interceptor) annotiert sind und einen parameterlosen Konstruktor besitzen. Darüber hinaus haben sie eine Methode mit der Signatur Object name(InvocationContext) throws Exception, die mit @AroundInvoke (javax.interceptor.AroundInvoke) annotiert ist. Wird der Interceptor einer Methode einer CDI Bean zugeordnet, so umhüllt die AroundInvoke-Methode jeden Aufruf der Bean-Methode (Listing 10.1).

@Interceptor
public class TransactionRequiredInterceptor
implements Serializable
{
@Resource
UserTransaction userTransaction;

@AroundInvoke
public Object manageTransaction(InvocationContext ctx)
throws Exception
{
// Falls schon eine TX aktiv, Methode direkt aufrufen
if (isTransactionActive())
return invocationContext.proceed();

// TX starten
this.userTransaction.begin();

// Bean-Methode aufrufen
Object result = ctx.proceed();

// TX abschliessen
this.userTransaction.commit();

return result;
}
}

Listing 10.1: Grundsätzlicher Aufbau eines Interceptors

Einer Bean-Methode können später durchaus mehrere Interceptors zugeordnet werden, die in der Art einzelner Schichten um die Bean-Methode herum funktionieren. Die Methode InvocationContext.proceed leitet den Aufruf weiter an die nächste Schicht, bis schließlich die Bean-Methode aufgerufen wird. Dadurch kann vor und nach dem Ablauf der Bean-Methode beliebiger Programmcode ausgeführt werden.

Im Beispiel ist ein Interceptor gezeigt, der zur Ausführung einer Methode eine aktive Transaktion sicherstellt. Der Ausschnitt in Listing 10.1 ist allerdings stark vereinfacht: Er enthält keine Behandlung von Exceptions ...

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