L’AOP - ou POA - est un paradigme de programmation ayant pour but de compléter la programmation orientée objet. L’AOP permet d’implémenter de façon plus propre les problématiques transverses à l’application. En effet, elle permet de factoriser du code dans des greffons, et de venir déployer ces derniers en divers endroits.
De ce fait, ce paradigme permet d’éviter la dispersion du code tout en améliorant sa réutilisabilité.
Les problématiques transverses traitées par l’AOP sont la plupart du temps techniques (l’identification de problématiques transverses fonctionnelles est plus difficile). L’AOP permet par exemple d’implémenter :
Une api standardisant les fonctionnalités communes à plusieurs tisseurs d’aspects est proposée par l’AOP Alliance .
La problématique traitée dans cet exemple est l’ajout d’un mécanisme de cache pour un service donné (dans l’exemple, ajout d’un cache sur la méthode getBook de BookService). L’AOP nous permet l’intégration d’un tel cache sans avoir à modifier le code existant. Dans l’exemple ci-dessous nous avons choisi d’utiliser AspectJ5 (déclaration des aspects via les annotations java 5) et OSCache. Le point de jonction sélectionné est la méthode getBook de la classe BookService :
com.cleverage.proto.BookService.getBook(String)
Ainsi chaque appel à la méthode suivante constituera un point de coupure :
Book book = BookService.getInstance().getBook("ISBN 2-2");
Ci dessous le code source de l’aspect gérant le cache. Ce code est basique (l’aspect peut uniquement être utilisé sur cette méthode...), il serait plus utile de définir un aspect de cache plus générique, pouvant venir se greffer sur différents services stateless.
@Aspect
public class BookCache
{
// nous utilisons la configuration par defaut
private static final GeneralCacheAdministrator CACHE_ADMIN = new GeneralCacheAdministrator();
// definition du point de coupe
@Pointcut("call(* com.cleverage.proto.BookService.getBook(String)) && args(ref)")
void getBook(String ref) {}
// écriture d'un code advice de type around
//(besoin d'executer du code avant et après les points de jonction)
@Around("getBook(ref)")
public Object getBookFromCache(final ProceedingJoinPoint thisJoinPoint, final String ref) throws Throwable
{
Book book;
try
{
// recuperation de la valeur à partir du cache
book = (Book) CACHE_ADMIN.getFromCache(ref, 1000);
}
// l'entree n'existe pas ou a expiree
catch (NeedsRefreshException nre)
{
boolean updated = false;
try
{
// execution du point de jonction
book = (Book) thisJoinPoint.proceed(new Object[] { ref });
// stockage de l'entree dans le cache
CACHE_ADMIN.putInCache(ref, book);
updated = true;
}
finally
{
if (!updated)
{
CACHE_ADMIN.cancelUpdate(ref);
}
}
}
return book;
}
}
En tant que paradigme de programmation, l’AOP n’est pas destinée seulement à Java, cependant il n’existe pas dans les autres langages des implémentations aussi mature que celles en java :
Du fait de l’amélioration de la qualité et de la modularité du code, l’avenir de l’AOP est prometteur. Cependant, sa démocratisation passera par une standardisation des APIs et la mise à disposition d’un outillage adapté (debug, modélisation, rétro-ingénierie...).
D’ailleurs, petite enquête : Quelles sont les utilisations d’AOP que vous avez mis en place ?
AOP en JavaScript avec JQuery 
http://code.google.com/p/jquery-aop/