Presente fin dalla prima versione del framework, l'Aspect Oriented Programming rappresenta, insieme all'Inversion of Control, una delle caratteristiche principali alle quali Spring deve la sua popolarità. Il suo supporto è garantito da Spring AOP, un modulo nativo del framework che nasce con lo scopo di fornire una completa integrazione con il container di IoC. Grazie a questa caratteristica, Spring AOP pur non essendo una delle soluzioni più complete sul mercato risulta essere estremamente flessibile e versatile.
A partire dalla versione 2.x Spring AOP è stato esteso con il supporto alle annotation AspectJ (@AspectJ
), portando di fatto un forte cambiamento nel modo di concepire AOP in Spring. Nelle prossime lezioni avremo modo di parlare dell'integrazione con @AspectJ
e dei vantaggi offerti sia sotto il profilo della modellazione dei crosscutting concern, sia dal punto di vista dell'apertura verso framework AOP di terze parti.
Per il momento concentriamoci invece sull'approccio classico di Spring AOP, il cui supporto è pienamente garantito anche nelle nuove versioni del framework.
Riprendiamo l'esempio utilizzato nelle lezioni sull'accesso ai dati tramite JDBC e proviamo ad aggiungere la funzionalità di logging alle invocazioni dei metodi coinvolti nelle operazioni di persistenza. Il punto di partenza è ovviamente l'interfaccia BookDao
dove tali operazioni vengono definite.
public interface BookDao {
public void insert(Book book);
public void update(Book book);
public void delete(String isbn);
public Book findByISBN(String isbn);
public List<Book> findAllBooks();
public int bookCount();
}
Gli advice di Spring AOP
Come abbiamo detto nella precedente lezione, le operazioni da compiere da parte di un crosscutting concern sono incapsulate in advice
, eseguiti al verificarsi di determinati JointPoint
(in Spring gli unici JointPoint intercettabili sono quelli legati all'esecuzione di metodi).
In Spring modellare un advice è abbastanza semplice e si riduce all'implementazione di apposite interfacce con le quali definire le azioni da intraprendere.
Ecco una tabella con gli advice messi a disposizione da Spring AOP.
Tipo di Advice | Momento dell'esecuzione | Interfaccia |
---|---|---|
BeforeAdvice |
prima dell'esecuzione di un metodo. | MethodBeforeAdvice |
AfterReturning |
dopo il ritorno di un risultato da parte di un metodo. | AfterReturningAdvice |
AfterThrowing |
in seguito al rilancio di un eccezione da parte di un metodo. | ThrowsAdvice |
AroundAdvice |
costruito intorno l'esecuzione di un metodo. | MethodInterceptor |
L'implementazione del concern di logging che ci siamo prefissati passa proprio per la definizione di appositi advice da associare alla classe che implementa l'interfaccia BookDao
.
Come avremo modo di vedere, la flessibilità di AOP sta nel fatto che gli advice sono svincolati dalle specifiche implementazioni degli oggetti target sui quale opererano e di fatto quello che costruiremo sarà un logger generico e riutilizzabile.