1. Prefacio
No presentaré a Spring AOP. Busqué mucho en línea. Cualquiera que haya usado Spring conoce el COI y AOP de Spring. A menudo usamos COI, pero en nuestro propio sistema, el uso de AOP es casi cero. Excepto por esta pequeña función de monitoreo que se aplica, las otras no se usan básicamente. A continuación, el editor resolverá la solución para usar el método de grabación de Spring AOP para ejecutar el tiempo. Echemos un vistazo si lo necesita.
2. Solución
1. Métodos tradicionales
El método más simple y aproximado es agregar la marca de tiempo al principio y al final de cada método que necesita estadísticas, y luego calcular la diferencia. El código es el siguiente:
Long StartTime = System.CurrentTimemillis (); // Comercial Código Long EndTime = System.CurrentTimemillis (); System.out.println ("Tiempo de ejecución del programa:" + (EndTime - Starttime) + "MS"); // Tiempo de ejecución del programa de salidaEste método requiere que se agregue un código que consume mucho tiempo a muchos métodos estadísticos. Estos códigos no tienen nada que ver con el negocio principal, pero se repiten en grandes cantidades y se dispersan en todas partes, lo que dificulta el mantenimiento.
2. Métodos de programación orientada a tangentes
Por lo tanto, no se recomienda usar el código de mal sabor anterior. Lo pensé durante mucho tiempo y planeé usar las ideas de Spring AOP para completar esta función. Sin más ADO, el código y las explicaciones relacionadas son las siguientes:
importar org.apache.commons.logging.log; importar org.apache.commons.logging.logFactory; importar org.spectj.lang.procedingjoinpoint; importar org.spectj.lang.annotation.around; importar org.spectj.lang.annotation.spect; importar org.spectj.lang.reflect.methodsignature; import org.springframework.stereotype.Component;/** * Time-consuming spring facet class for detection method execution* Using the class annotated by @Aspect, Spring will treat it as a special bean (a section), that is, it will not dynamically proxy the class itself* @author blinkfox * @date 2016-07-04 */@Aspect@Componentpublic class TimeInterceptor { private static Log logger = logFactory.getLog (TimeInterceptor.Class); // Un minuto, es decir, 1000 ms privados estáticos finales long one_minute = 1000; // La sección estadística que consume el tiempo de la capa de servicio debe ser final para el tipo de cadena, las variables que se utilizarán en la anotación solo pueden ser el tipo estático constante público estático final de cadena final = "ejecución (*com.blinkfox.test.service.impl.*.*(..))"; / ** * Ejecución del método estadístico que consumen mucho tiempo en torno a la notificación circundante * @param unión de unión * @return */ @around (punto) objeto público timearound (procedimientojoinpoint unión de unión) {// Defina los parámetros requeridos para devolver el objeto y obtener el método. Objero obj = nulo; Objeto [] args = uniónPoint.getArgs (); Long Starttime = System.CurrentTimemillis (); intente {obj = JoinPoint.proced (args); } Catch (Throwable E) {Logger.error ("Errores de estadísticas en las notificaciones envolventes que consumen tiempo de ejecución", e); } // Obtener el nombre del método de ejecución Long EndTime = System.CurrentTimemillis (); MethodSignature Signature = (MethodeSignature) unkenPoint.getSignature (); String MethodName = Signature.getDeClaringTypeName () + "." + firma.getName (); // Imprima información que consume tiempo this.printexectime (MethodName, Starttime, Endtime); regresar obj; } /*** Imprima información que consume tiempo que imprime la ejecución del método. Si excede una hora determinada, imprima * @param MethodName * @param Starttime * @param EndTime */ private void printExectime (string metodName, long starttime, largo endtime) {long difftime = endtime - starttime; if (difftime> one_minute) {logger.warn ("-----" + metodName + "Tiempo de ejecución del método:" + difftime + "ms"); }}} Nota: Finalmente, debe agregar la configuración requerida por AOP en el archivo applicationContext.xml <aop:aspectj-autoproxy/> para que ese resorte pueda reconocerlo.
Resumir
Lo anterior se trata de usar Spring AOP para registrar el tiempo de ejecución. Espero que el contenido de este artículo sea de ayuda para el estudio o el trabajo de todos. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse. Gracias por su apoyo a Wulin.com.