back to top

AOP – Introduzione alla programmazione orientata agli aspetti – Guida Java Spring

La programmazione orientata agli aspetti (Aspect-Oriented Programming o, più brevemente, AOP) rappresenta un altro modo di vedere la progettazione di un software. Al contrario della programmazzione orientata sugli oggetti (Object-Oriented Programming – OOP) dove l'elemento principale è la classe, nella AOP tutto è basato sugli aspect.

Un aspect rappresenta una modularizzazione di una relazione trasversale tra più classi, cioè un modulo che contiene più classi che hanno un interesse comune (ad esempio la gestione delle transazioni). Oltre agli aspect ci sono altri concetti su cui si basa l'AOP:

  • join point: è un punto di esecuzione di un programma, come l'esecuzione di un metodo.
  • advice: è l'azione intrapesa da un aspect in un determinato join point.
  • pointcut: è un predicato scritto attraverso un'espressione che lega un join point ad un advice, cioè una advice viene eseguito quando un pointcut matcha un join point. Ad esempio supponiamo che una classe abbia il metodo doSomething(), l'esecuzione del metodo è il join point, mentre invece il pointcut potrebbe essere un'espressione del tipo "prima dell'esecuzione del metodo doSomething()".
  • target object: sono gli oggetti sui quali vengono eseguiti degli advice.
  • introduction: attraveso una introdutction è possibile aggiungere nuove interfacce, e quindi nuovi metodi ai target object.
  • AOP proxy: è l'oggetto che viene creato dall'AOP framework per implementare gli advice e la loro esecuzione.
  • weaving: il processo che lega gli advice ai vari aspect per creare i target object. Di solito questo processo avviene a runtime.

Gli advice possono essere di vari tipi:

  • before advice: sono gli advice che vengono eseguiti prima di un join point, ad esempio prima dell'esecuzione di un metodo. Non possono fermare l'esecuzione del flusso a meno che non lancino un'eccezione.
  • after returning advice: sono gli advice che vengono eseguiti quando termina un join point in maniera normale, cioè senza lanciare eccezioni.
  • after throwing advice: sono gli advice che vengono eseguiti quando un join point termina in maniera anomala, cioè lanciando un'eccezione.
  • after advice: sono gli advice che vengono eseguiti quando un join point termina sia in maniere normale che in maniera anomala.
  • around advice: sono gli advice più potenti e vengono eseguiti prima e dopo un join point. Attraverso questo tipo di advice si può fermare l'esecuzione del flusso, ad esempio impedendo l'esecuzione di un metodo, cambiare il suo valore di ritorno o lanciare una eccezione.

In Spring sono supportati solamente i join point relativi all'esecuzione di un metodo, quindi Spring non offre una implementazione AOP completa ma, tuttavia, sufficiente a risolvere i problemi più comuni delle applicazioni enterprise.

Per implementare le funzionalità di AOP ogni target object viene wrappato in un proxy che espone le stesse interfacce che l'oggetto implementa. Di default vengono usati i J2SE dynamic proxies che però permettono solo di proxare interfacce o set di interfacce. I proxies di CGLIB vengono invece usati quando un oggetto non implementa interfacce, se ne può forzare l'uso nei rari casi in cui bisogna creare un pointcut su di un metodo che non è esposto nell'interfaccia.

Pubblicitร