
Introduzione all'AOP in Spring
L'AOP, acronimo di Aspect Oriented Programming, è un paradigma di programmazione finalizzato all'incremento della modularità delle applicazioni.
In ogni progetto sono presenti delle funzionalità specifiche del dominio applicativo come ad esempio la gestione del carrello della spesa o del catalogo dei prodotti in un e-commerce.
Al contrario l'applicazione web di una banca avrà delle funzionalità che gestiscono la lista dei movimenti, la possibilità di inviare dei bonifici o di fare delle transazioni finanziarie.
In sostanza parliamo della cosiddetta logica di business che dovrebbe essere isolata all'interno di opportuni moduli, ciascuno con una singola responsabilità.
Non è importante che si tratti di una applicazione monolitica all'interno della quale sono incluse tutte queste componenti o di una architettura a microservizi dove c'è proprio una separazione fisica delle singole funzionalità.
A queste si affiancano le cosiddette funzionalità trasversali, note con il termine inglese di cross-cutting concerns, che in primo luogo interessano più moduli dell'applicazione e allo allo stesso tempo non sono strettamente legati alla business logic.
Ad esempio parliamo di tutte quelle attività legate al logging piuttosto che alla sicurezza o all'invio delle notifiche ecc.
Lo scopo della AOP è proprio quello di estrarre tutte queste funzionalità trasversali dai singoli moduli di business e trasferirle in un altro opportunamente predisposto.
I vantaggi di questo approccio sono essenzialmente due:
-
andiamo ad eliminare dai moduli business tutto ciò che non è strettamente legato ad essi, rendendoli ancora più aderenti al principio della singola responsabilità
-
concentriamo tutto il codice "trasversale" in un unico modulo, denominato per l'appunto Aspect, facilitando le successive fasi di manutenzione.
A questo punto dobbiamo introdurre una serie di termini tecnici per capire come funziona esattamente l'AOP e come può essere implementata.
Partiamo dall'Advice che può essere considerato come l'implementazione di un Aspect, ovvero si tratta di metodi inseriti in una opportuna classe e che implementano delle operazioni aggiuntive.
Tali Advice sono eseguiti in corrispondenza di un JoinPoint ovvero di un metodo o di una eccezione che fanno parte della business logic dell'applicazione.
In parole povere quando viene invocato un metodo business o sollevata un'eccezione è possibile eseguire il codice specificato nell'Advice.
Ad essere precisi esistono varie tipologie di Advice che consentono di indicare l'evento preciso in corrispondenza del quale entrano in gioco.
Le principali sono:
- Before: l'Advice viene eseguito prima dell'invocazione del JoinPoint
- After: l'Advice viene eseguito dopo l'esecuzione del JoinPoint
- Around: in questo caso una parte dell'Advice viene eseguita prima del JoinPoint e un'altra dopo il suo completamento
- After returning: l'Advice viene eseguito dopo l'esecuzione del JoinPoint e solo nel caso in cui non ci siano stati errori
- After throwing: l'Advice viene eseguito solo se è stata sollevata un'eccezione dopo l'invocazione del JoinPoint.
La selezione dei JoinPoint avviene attraverso opportuni predicati (che possono utilizzare anche le espressioni regolari) denominati Pointcut.
In questo modo si può decidere se l'Advice deve essere applicato solo ad uno specifico metodo oppure ad un gruppo di metodi con caratteristiche comuni, con il vantaggio di non dover duplicare il codice limitando il rischio di commettere errori e facilitando le successive fasi di manutenzione.
Il Target Object è l'oggetto a cui si applica l'Advice in corrispondenza di un JoinPoint selezionato mediante un opportuno Pointcut.
Infine il Proxy Object rappresenta l'oggetto che viene effettivamente creato mixando il Target Object e l'Advice.
E' proprio il Proxy Object ad interagire direttamente con il client reindirizzando le richieste al Target Object.
In questo modo è possibile fare delle elaborazioni aggiuntive senza dover modificare il codice originale.
Ad esempio gestire tutte le attività di logging senza toccare le classi di business.
Non a caso i proxy fanno parte di uno dei design pattern più utilizzati nell'ambito della progettazione del software.
Naturalmente il vantaggio di Spring è che la gestione dell'AOP è del tutto trasparente. Come vedremo nel prossimo articolo sono sufficienti poche annotazioni per implementare l'intero meccanismo in pochissimo tempo.