Cómo utilizar la programación de aspectos para generar registros en Java
1. Primero cree una clase de Controlador de interceptación de anotaciones personalizada, el código es el siguiente
/**
* Controlador de interceptación de anotaciones personalizado
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ControllerLog {
String desc() default "" // Indica que la impresión predeterminada está vacía
}
2. Cree una clase de aspecto de registro de impresión, introduzca la anotación de aspecto @Aspect.
El nuevo código del método es el siguiente:
//Pointcut de la capa del controlador
@Pointcut ("@annotation(org .springframework.web.bind.annotation.RequestMapping)")
public void recordLog() {
}
@Around( "recordLog()")
objeto público alrededor(ProceedingJoinPoint pjp) throws Throwable {
// ExPatternParser.initLogger();
long start = System. currentTimeMillis();
p>
Objeto[] args = pjp.getArgs();
Comentario de cadena = this.getControllerMethodDescription(pjp);
Objeto retVal = null;
prueba {
retVal = pjp.proceed();
} catch (Throwable e) {
// TODO Bloque de captura generado automáticamente p>
logger.error("Solicitud fallida" e.toString(), e);
remark = remark ".
Causa de excepción por " e.toString();
throw e;
}finally{
long end = System.currentTimeMillis();
long cost = end - start;
//Imprimir registro de acceso
//Los parámetros de todos los métodos en el Controlador, los dos primeros son: Solicitud, Respuesta p >
if(args != null & args.length gt; 0){
Objeto o = args[0];
if(o instancia de HttpServletRequest) {
Solicitud HttpServletRequest = (HttpServletRequest) args[0];
PrintLog.visit(solicitud, costo, comentario);
}
}
}
return retVal;
}
/**
* Obtención de anotaciones La descripción la información del método se utiliza para las anotaciones de la capa del controlador
* @param punto de corte joinPoint
* @return descripción del método
* @throws Exception
*/
Cadena estática pública getControllerMethodDescription(ProceedingJoinPoint joinPoint)
lanza la excepción {
Cadena targetName = joinPoint.getTarget().getClass(). getName();
Nombre del método de cadena = joinPoint.getSignature().getName();
Objeto[] argumentos = joinPoint.getArgs();
Clase targetClass = Class.forName(targetName);
Método[] métodos = targetClass.getMethods();
Descripción de cadena = "";
for (Método método: métodos) {
if (method.getName().equals(methodName)) {
Clase[] clazzs = método.getParameterTypes();
if (clazzs.length == argumentos.length) {
ControllerLog controladorLog = método.getAnnotation(ControllerLog.class);
if (controllerLog !=null){
descripción =
controllerLog.desc();
}
descanso;
}
}
}
descripción de la devolución;
}
3. Luego agregue anotaciones a cada clase de Controlador:
@ControllerLog(desc = "Registrar contenido que se imprimirá")