Fino ad ora abbiamo visto come, attraverso l'utilizzo di appositi advice, sia possibile eseguire azioni negli attimi che precedono e seguono l'invocazione di un metodo. Spring AOP permette di spingersi oltre mettendo a disposizione un around advice: implementando l'interfaccia MethodInterceptor
è possibile acquisire il pieno controllo dell'invocazione di un metodo, inclusa la sua esecuzione.
Grazie all'utilizzo di questo advice è possibile non solo combinare tutti i comportamenti visti in precedenza, ma anche determinare se un metodo debba essere eseguito o meno.
public class LogAroundAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
// Log prima dell'invocazione del metodo
System.out.println("[" + new Date() + "]nt"
+ methodInvocation.getClass() + "." + methodInvocation.getMethod().getName()
+ "ntArgomenti: "+ Arrays.toString(methodInvocation.getArguments()));
Object result = null;
try {
// invocazione metodo
result = methodInvocation.proceed();
}
catch (Exception ex) {
// Log dell'eccezione ritornata dal metodo
System.out.println("tErrore: " + ex.getMessage());
}
// Log del riusultato dell'invocazione del metodo
System.out.println("tRisultato: "+ result);
return result;
}
}
Anche in questo caso il modo di operare non cambia. Una volta implementata l'interfaccia MethodInterceptor
sarà possibile specificare la logica da eseguire direttamente in invoke()
.
A supporto di questa operazione abbiamo il parametro MethodInvocation
con il quale, oltre ad ottenere le informazioni legate all'esecuzione del metodo richiamato sul target object, è possibile specificarne il momento dell'invocazione (operazione obbligatoria se si vuole che il metodo sia effettivamente invocato).