Iniziamo con la definizione dell'advice incaricato di gestire il logging dell'attimo precedente l'invocazine di un metodo.
public class LogBeforeAdvice implements MethodBeforeAdvice {
public void before(Method method, Object[] args, Object target) throws Throwable {
// Log prima dell'invocazione del metodo
System.out.println("[" + new Date() + "]nt"
+ target.getClass() + "." + method.getName()
+ "ntArgomenti: "+ Arrays.toString(args));
}
}
La prima cosa che salta all'occhio è la semplicità con cui è stato realizzato l'advice: è bastato semplicemente far implementare ad una classe l'interfaccia MethodBeforeAdvice
e inserire nel metodo before
la logica di logging.
Il metodo before fornisce inoltre una serie di parametri utili che vanno dal riferimento all'oggetto target sul quale l'advice opera, al metodo invocato e ai suoi parametri di lancio.
Le cose non cambiano con gli altri tipi di advice come possiamo vedere nei prossimi snippet di codice.
public class LogAfterReturningAdvice implements AfterReturningAdvice {
// Log del risultato dell'invocazione del metodo
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("tRisultato: "+ returnValue);
}
}
In questo caso abbiamo definito il comportamento del logger, a seguito di un invocazione di un metodo. L'unica differenza con quanto visto in precedenza, oltre al nome dell'interfaccia da implementare che qui è AfterReturningAdvice
, è rappresentata dai parametri del metodo afterReturning
tra i quali troviamo anche il valore di ritorno.
Per completare il logger manca semplicemente la gestione delle eventuali eccezioni che si possono verificare durante l'esecuzione dei metodi, che è possibile fare attraverso l'utilizzo dell'interfaccia ThrowsAdvice
.
public class LogThrowAdvice implements ThrowsAdvice {
// Log dell'eccezione ritornata dal metodo
public void afterThrowing(Exception e) throws Throwable {
System.out.println("tErrore: " + e.getMessage());
}
}