Encore une astuce pour principalement faire du log, mais qui pourrait servir à établir des filtre de sécurité., ou l'envoi de mail automatique, ou encore des tests de performances,...
L'interception des appels des méthodes des EJB grâce à la Programmation Orientée Aspect !!
EJB3 permet d'agir lors des évènements du cycle de vie d'un EJB grâce aux annotations suivantes :
- @PostConstruct --> intercepte l'instanciation de l'EJB.
- @AroundInvoke --> intercepte l'appel d'une fonction de l'EJB.
- @PreDestroy --> intercepte la destruction de l'EJB.
- pour les Entity Beans il existe d'autres annotations s'appuyant sur le même mécanisme.
Ces annotations permettent de définir des méthodes "CallBack Interceptors".
exemple d'utilisation :
@PostConstruct
public void interceptConstruct(InvocationContext ctx) throws Exception //InvocationContext permet d'accéder aux infos
{
//traitement avant l'instanciation
if(isDebugPostConstruct)
{
log.debug(">> Construction de l'EJB " + ctx.getTarget().getClass().getSimpleName());
}
try
{
ctx.proceed();// On valide l'instanciation
}
finally //le finally nous permet d'agir apres l'événement géré par la fonction
{
if(isDebugPostConstruct)
log.debug(">> Construction de l'EJB " + ctx.getTarget().getClass().getSimpleName() + " finie.");
}
}
On peut définir ces fonction à l'intérieur du Bean, mais aussi dans une class externe grace à l'annotation @Interceptors.
Deplus @Interceptors accepte en paramètre une liste de classes qui seront appelées itérativement (de gauche à droite) si ctx.proceed() est appelé, ce qui sera très avantageux pour établir des filtres en cascade. ^^
Voici une gestion des logs pour la création et l'appel d'EJBs sessions.
cf. fichier interceptEJB.java :
interceptEJB