Java Reference
In-Depth Information
denen der erste vom Typ int ist, sowie ihre Namen mit dem Buchstaben m beginnen
müssen. Pointcuts werden häufi g durch reguläre Ausdrücke über Package-, Klassen- und
Methodennamen und deren Parameter defi niert.
! Advisor: Ein Advisor ist ein Advice und ein dazugehöriger Pointcut, der festlegt, wo der
Advice „einzuweben“ ist. Zu einem Programm kann es mehrere Advisors geben.
149 Fün e Spring-Anwendung: AOP
Als AOP-Anwendung wollen wir das „klassische“ Logging realisieren. Dazu muss ein Advice
programmiert werden, in dem sich die Ausgaben zur Protokollierung befi nden. Ein Advice
muss in Spring AOP immer eine bestimmte Schnittstelle implementieren. Im Folgenden
verwenden wir die Schnittstelle MethodInterceptor, die eine einzige Methode namens
invoke besitzt. Als Parameter von invoke wird ein Objekt des Typs MethodInvocation über-
geben. Von diesem kann man sich über getMethod die aufgerufene Methode als Method-
Objekt geben lassen, über getThis das „eigentliche“ Objekt, auf das der Methodenaufruf, der
vom Advice abgefangen wurde, angewendet wurde, und über getArguments die Parameter
des Methodenaufrufs. Ferner kann man durch Aufruf von proceed auf das MethodInvo-
cation-Objekt die „eigentliche“ Methode auf das „eigentliche“ Objekt anwenden. Mit ande-
ren Worten: Mit proceed kann man den Methodenaufruf durchführen, der vom Advice abge-
fangen wurde. Der Advice-Code ist nicht verpfl ichtet, proceed auszuführen. Denken Sie an
das Caching-Beispiel! Wenn festgestellt wird, dass das Ergebnis schon einmal berechnet
wurde und im Cache vorliegt, soll eben gerade in einem solchen Fall die Neuberechnung
eingespart werden. Für das Logging-Beispiel wird aber proceed in allen Fällen durchge-
führt, wie Listing 14.9 zeigt, das den Advice-Code enthält.
Listing 14.9 Advice-Klasse LoggingInterceptorAdvice
package javacomp.spring.aop;
import java.lang.reflect.*;
import org.aopalliance.intercept.*;
public class LoggingInterceptorAdvice implements MethodInterceptor
{
public Object invoke(MethodInvocation invocation)
throws Throwable
{
Object target = invocation.getThis();
Method m = invocation.getMethod();
Object[] args = invocation.getArguments();
String message =
"Aufruf von " + target.getClass().getName() +
"." + m.getName() + "(";
for(int i = 0; i < args.length; i++)
{
message += args[i];
if(i < args.length - 1)
{
 
Search WWH ::




Custom Search