Dans Spring Framework, "AOP" est une technologie de base importante avec DI (Dependency Injection). AOP est l'acronyme de "Aspect Oriented Programming". Les aspects sont ce que l'on appelle communément des «préoccupations transversales».
1.@Aspect En ajoutant @Aspect à une classe, cette classe sera reconnue comme Aspect. 2.@Pointcut Spécifiez l'emplacement (méthode) pour insérer le processus transversal. 3.@Before Conseil exécuté avant le traitement de la méthode cible. 4.@After Conseil toujours exécuté quel que soit le résultat du traitement de la méthode cible. 5.@AfterReturning Avis qui n'est exécuté que lorsque le traitement de la méthode cible est terminé avec succès. 6.@AfterThrowing Avis qui n'est exécuté que lorsqu'une exception se produit lors du traitement de la méthode cible.
LoggingAspect.java
package aspect.log;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**Classe d'aspect de sortie de journal. */
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
/**Coupure de point de méthode publique.Sortie du journal des erreurs système*/
@Pointcut("execution(public * *(..))")
private void publicLog() {}
/**Coupure de point de paquet Dao.sortie du journal des opérations de base de données*/
@Pointcut("within(app.dao..*)")
private void dbLog() {}
/**Coupure du point du package Web.Enregistrer la sortie des demandes, des réponses, etc.*/
@Pointcut("within(app.web..*)")
private void webLog() {}
/**
*Enregistrer la sortie avant d'exécuter la méthode.
*
* @point de jointure param jp
*/
@Before("publicLog() && (dbLog() || webLog())")
public void dobefore(JoinPoint jp) {
Signature sig = jp.getSignature();
String args = "Aucun";
if(jp.getArgs() != null && jp.getArgs().length > 0 ) {
args = Arrays.toString(jp.getArgs());
}
logger.info("[Démarrer l'opération]" +"Méthode:"+sig.getDeclaringTypeName() + "."+sig.getName()+"#Paramètres d'entrée:"+ args);
}
/**
*Sortie du journal après l'exécution de la méthode.
*
* @point de jointure param jp
*/
@AfterReturning(pointcut="publicLog() && (dbLog() || webLog())",returning="returnValue")
public void doAfterReturning(JoinPoint jp,Object returnValue) {
Signature sig = jp.getSignature();
logger.info("[Fin de l'opération]"+"Méthode:"+sig.getDeclaringTypeName() + "."+sig.getName()+"#Valeur de retour:" + returnValue);
}
/**
*Si une erreur se produit, la sortie du journal.
*
* @point de jointure param jp
*/
@AfterThrowing (pointcut="publicLog() && (dbLog() || webLog())",throwing="ex")
public void doAfterThrowing(JoinPoint jp,Exception ex) {
Signature sig = jp.getSignature();
StringWriter erMessage=new StringWriter();
ex.printStackTrace(new PrintWriter(erMessage));
logger.info("【Erreur】" + "Méthode:"+sig.getDeclaringTypeName() + "."+sig.getName()+"#Message d'erreur:" + erMessage.toString());
}
}
Merci d'avoir lu jusqu'au bout.
référence: https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#aop https://iikanji.hatenablog.jp/entry/2018/04/26/204324
Recommended Posts