Im Spring Framework ist "AOP" neben DI (Dependency Injection) eine wichtige Kerntechnologie. AOP steht für "Aspect Oriented Programming". Aspekte werden allgemein als "Querschnittsthemen" bezeichnet.
1.@Aspect Durch Hinzufügen von @Aspect zu einer Klasse wird diese Klasse als Aspekt erkannt. 2.@Pointcut Geben Sie den Ort (die Methode) an, an dem der Querschnittprozess eingefügt werden soll. 3.@Before Hinweis, der vor der Verarbeitung der Zielmethode ausgeführt wird. 4.@After Hinweis, der unabhängig vom Verarbeitungsergebnis der Zielmethode immer ausgeführt wird. 5.@AfterReturning Hinweis, der nur ausgeführt wird, wenn die Verarbeitung der Zielmethode erfolgreich abgeschlossen wurde. 6.@AfterThrowing Hinweis, der nur ausgeführt wird, wenn während der Verarbeitung der Zielmethode eine Ausnahme auftritt.
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;
/**Protokollausgabeaspektklasse. */
@Aspect
@Component
public class LoggingAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);
/**Öffentlicher Methodenpunktschnitt.Ausgabe des Systemfehlerprotokolls*/
@Pointcut("execution(public * *(..))")
private void publicLog() {}
/**Dao Package Point Cut.Ausgabe des DB-Betriebsprotokolls*/
@Pointcut("within(app.dao..*)")
private void dbLog() {}
/**Webpaket Punkt schneiden.Protokollausgabe von Anfragen, Antworten usw.*/
@Pointcut("within(app.web..*)")
private void webLog() {}
/**
*Protokollieren Sie die Ausgabe, bevor Sie die Methode ausführen.
*
* @param jp join point
*/
@Before("publicLog() && (dbLog() || webLog())")
public void dobefore(JoinPoint jp) {
Signature sig = jp.getSignature();
String args = "Keiner";
if(jp.getArgs() != null && jp.getArgs().length > 0 ) {
args = Arrays.toString(jp.getArgs());
}
logger.info("[Betrieb starten]" +"Methode:"+sig.getDeclaringTypeName() + "."+sig.getName()+"#Eingabeparameter:"+ args);
}
/**
*Protokollausgabe nach Ausführung der Methode.
*
* @param jp join point
*/
@AfterReturning(pointcut="publicLog() && (dbLog() || webLog())",returning="returnValue")
public void doAfterReturning(JoinPoint jp,Object returnValue) {
Signature sig = jp.getSignature();
logger.info("[Betriebsende]"+"Methode:"+sig.getDeclaringTypeName() + "."+sig.getName()+"#Rückgabewert:" + returnValue);
}
/**
*Wenn ein Fehler auftritt, protokollieren Sie die Ausgabe.
*
* @param jp join point
*/
@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("【Error】" + "Methode:"+sig.getDeclaringTypeName() + "."+sig.getName()+"#Fehlermeldung:" + erMessage.toString());
}
}
Vielen Dank für das Lesen bis zum Ende.
Referenz: 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