Antecedentes de requisito
En un proyecto reciente, cuando el proyecto se completa básicamente, el cliente propuso registrar los registros de todas las operaciones comerciales en la base de datos y extraer alguna información comercial clave (como los números de pedido de transacciones) en el registro.
Para garantizar el período de construcción, después de revisar la información, decidí usar anotaciones personalizadas AOP + para completar este requisito.
Preparación
Los paquetes JAR que deben depender de anotaciones personalizadas incluyen SuppectJRT-XXX.JAR, SuppeJweaver-XXX.JAR y XXX representa el número de versión.
Anotaciones personalizadas
Se crea un paquete de registro separado en el proyecto para almacenar contenido relacionado con el registro
**. Common.log.annotation // ubicación de almacenamiento de anotación personalizada **. Common.log.aop // ubicación de almacenamiento de herramientas de AOP
Cree una nueva clase de anotación personalizada en el paquete de anotación:
paquete **. Common.log.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.retention; import java.lang.annotation.retentionPolicy; import java.lang.annotation.target; @Target ({elementType.method})@retención (retrenada XXXOPERATELOG { / *** Tipo de operación Descripción* @return* / string operateTyPedesC () predeterminado ""; / *** Tipo de operación* @return*/ long operateType () default -1; / *** Codificación del módulo* @return*/ string mouseCode () predeterminado "m30"; / *** nombre del módulo* @return*/ string mouseName () predeterminado "xx módulo"; / *** Tipo de negocio* @Return*/ String Busstype () predeterminado ""; / *** Descripción del tipo de negocio* @return*/ string busstypedesc () predeterminado "";}Cree un nuevo xxxoperatelogaop bajo el paquete AOP
Paquete **. Common.log.aop; import **; // omit @aspecto @componentPublic class xxxxoperatelogaop {@aUtoWired SystemlogService SystemlogService; HttpservletRequest request = null; Logger logger = loggerFactory.getLogger (xxxoperatelogaop.class); ThreadLocal <Rong> time = new ThreadLocal <Long> (); // ID único utilizado para generar registros de operaciones, utilizados para llamar a la estática pública para los registros de auditoría de procesos de negocios ThreadLocal <String> tag = new ThreadLocal <String> (); // Declarar el punto de entrada AOP, cualquier método que use xxxoperatelog se intercepte @pointcut (" @annotation (**. Common.log.annotation.xxxxoperatelog)") public void log () {System.out.println ("Soy un punto de entrada"); } / *** Corte en todos los lugares marcados @log* @param unkenpoint* / @before ("log ()") public void antes de Elexec (unión unión) {time.set (System.CurrentTimemillis ()); info (punto de unión); // Establezca el número de identificación único de registros de registro Tag.set (uuid.randomuuid (). ToString ()); request = ((ServLetRequestatTributes) requestContexTholder.getRequestatTributes ()). GetRequest (); } @After ("log ()") public void AfterExec (unkePoint unkePoint) {Methodsignature MS = (MethodSignature) unkenPoint.getSignature (); Método método = ms.getMethod (); logger.debug ("etiqueta como" + tag.get () + "método" + método.getName () + "ejecutar consumo" + (system.currentTimemillis () - time.get ()) + "ms"); } // En el proceso de ejecutar el método de destino, este método se ejecutará, y el registro se puede implementar aquí @around ("log ()") Objeto público alrededor de EXEC (procedimientojoinpoint PJP) lanza lando {objeto ret = pjp.proceed (); intente {objeto [] orgs = pjp.getArgs (); Systemlog valueTurn = null; for (int i = 0; i <orgs.length; i ++) {if (orgs [i] instanceof systemlog) {valueeturn = (systemlog) orgs [i]; }} if (valueTurn == null) {valueeturn = new Systemlog (); } if (valueTurn! = null && request! = null) {Methodsignature ms = (Methodsignature) pjp.getSignature (); Método método = ms.getMethod (); // Obtener la información de registro de operación de la anotación xxxoperatelog log = método.getAnnotation (xxxxoperatelog.class); String BusinessType = log.busstype (); String BusinessDesc = log.busstypedesc (); Hashmap requestmap = servletUtils.getParamETERSTOHASHMAP (solicitud); // Busque el tipo de negocio de los parámetros if (BusinessType.equals ("")) {ObjusSingSingType = requestMap.get ("Business_Type"); BusinessType = objbusinesstype == nulo? "": ObjbusinessType.ToString (); } // encontró el tipo de negocio del formulario de solicitud para el objeto de resultado de ejecución aplicar = request.getAttribute ("aplicar"); if (aplicar! = null) {jsonObject obj = jsonfactory.tojsonabStractEntity (aplicar); if (obj! = null) {valueTurn.setotherTherDesc ("Aplicar número:"+obj.getString ("Aplicar_no")); if (BusinessType.equals ("")) {BusinessType = obj.getString ("Business_Type"); }}} // Encontrar el tipo de negocio a partir de los parámetros del proceso de ejecución del método (generalmente establecido manualmente) if (BusinessType.equals ("")) {BusinessType = (String) request.getAttribute ("Business_Type"); BusinessType = BusinessType == NULL? "": BusinessType; } if (! BusinessType.equals ("") && BusinessDesc.Equals ("")) {BusinessDesc = xxxsysconstant.business_type.getName (BusinessType); } valueTurn.setBusStype (xxxsysconstant.business_type.getNumber (BusinessType)); valueeturn.setbusstypedesc (BusinessDesc); valueTurn.setMoudlecode (log.moudlecode ()); valueTurn.setMoudlename (log.moudlename ()); valueeturn.setOperateresult (xxxsysyconstant.yesorno.yes); valueTurn.setOperateType (log.operateType ()); valueTurn.setInputUserId ((((UserContext) webutilils.getSessionAttribute (solicitud, "xxxuserContext")). getSySUser (). getId ()); valueTurn.SetOperateTyPedesc (log.operatetypedesc ()); valueTurn.setRequestip (getRemoteHost (solicitud)); valueTurn.setRequestUrl (request.getRequesturi ()); valueTurn.setserverip (request.getLocalAddr ()); valueTurn.setUids (tag.get ()); // Guardar el registro de operaciones SystemlogService.Savesystemlog (ValuerTurn); } else {logger.info ("No registre la información del registro"); } // Guardar el resultado de la operación} Catch (Exception e) {E.PrintStackTrace (); } return return; } // registro de excepción log @AfterThrowing (PointCut = "log ()", showing = "e") public void doafterthrowing (unkepoint unkenpoint, showable e) {try {info (unkenpoint); Objeto [] orgs = unkePoint.getArgs (); Systemlog valueTurn = null; for (int i = 0; i <orgs.length; i ++) {if (orgs [i] instanceof systemlog) {valueeturn = (systemlog) orgs [i]; }} if (valueTurn == null) {valueeturn = new Systemlog (); } if (valueTurn! = null && request! = null) {Methodsignature MS = (Methodsignature) unkenPoint.getSignature (); Método método = ms.getMethod (); Xxxoperatelog log = método.getAnnotation (xxxoperatelog.class); String BusinessType = log.busstype (); String BusinessDesc = log.busstypedesc (); if (BusinessType.equals ("")) {Objus ObjBusinessType = ServletUtils.getParamTerstoHashMap (solicitud) .get ("Business_Type"); BusinessType = objbusinesstype == nulo? "": ObjbusinessType.ToString (); BusinessDesc = xxxsysconstant.business_type.getName (BusinessType); } valueTurn.setBusStype (xxxsysconstant.business_type.getNumber (BusinessType)); valueeturn.setbusstypedesc (BusinessDesc); valueTurn.setMoudlecode (log.moudlecode ()); valueTurn.setMoudlename (log.moudlename ()); valueTurn.setOperateType (log.operateType ()); valueTurn.SetOperateTyPedesc (log.operatetypedesc ()); valueTurn.setInputUserId ((((UserContext) webutilils.getSessionAttribute (solicitud, "xxxuserContext")). getSySUser (). getId ()); valueTurn.SetOperateresult (xxxsysconstant.yesorno.no); String errmes = e.getMessage (); if (errmes! = null && errmes.length ()> 800) {errmes = errmes.substring (0, 800); } valueTurn.setErrorMessage (errmes); valueTurn.setRequestip (getRemoteHost (solicitud)); valueTurn.setRequestUrl (request.getRequesturi ()); valueTurn.setserverip (request.getLocalAddr ()); valueTurn.setUids (tag.get ()); SystemlogService.Savesystemlog (ValuerTurn); } else {logger.info ("No se registra la información de registro"); }} capt (excepción e1) {e1.printstackTrace (); }} Información vacía privada (unión de unión unión) { logger.debug("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Object[] OS = unión.getArgs (); logger.debug ("SourCeLocation:/t" + unkenpoint.getSourCeCalation ()); logger.debug ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------- request.getheader ("proxy-client-ip"); request.getRemoteAddr ();Modifique el archivo de configuración Spring-Mvc.xml y agregue la siguiente configuración
< Expression = "org.springframework.stereotype.controller"/> </context: component-scan>
Cabe señalar que la configuración anterior debe colocarse en el mismo archivo XML, ya sea Spring-Mvc.xml o Spring-Context.xml, de lo contrario, puede no entrar en vigencia, y la razón aún no se ha encontrado.
Uso de anotaciones
@XXXXOPERATELOG (busStype = xxxsysconstant.business_type.yyyy, busstypeDesc = "Descripción de tipo de negocio", operateType = xxxsysysconstant.logoperateType.query, operatetyPedesc = "descripción de operación") @requestmapping (valor = "/**/**/Queryxxx4DatAgrid.json", Method.json ". RequestMethod.post) public void queryxxxxx4dataGrid (httpservletRequest solicitud, httpServletResponse arg1, modelo modelo, escritor escritor) { logger.info("============================================================================================= HttpServletResponse arg1, Model model, Writer writer) { logger.info("=============================== HttpServletResponse arg1, Model model, Writer writer) { logger.info("========================= HttpServletResponse arg1, Model model, Writer writer) { logger.info ("==================== HttpServletResponse Arg1, Modelo Modelo, escritor escritor) {logger.info (" ===================== HttpServletResponse Arg1, modelo modelo, escritor) { logger.info ("================== HttpServletResponse Arg1, Modelo Model, escritor escritor) {logger.info (" ====================== HttpServletResponse Arg1, modelo modelo, escritor) { logger.info ("==================== HttpServletResponse Arg1, Modelo Modelo,La anotación personalizada SpringMVC anterior, el método de usar AOP para realizar el registro es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.