Contexte des exigences
Dans un projet récent, lorsque le projet est essentiellement terminé, le client a proposé d'enregistrer les journaux de toutes les opérations commerciales dans la base de données et d'extraire certaines informations commerciales clés (telles que les numéros de commande de transaction) dans le journal.
Afin d'assurer la période de construction, après avoir examiné les informations, j'ai décidé d'utiliser des annotations personnalisées AOP + pour remplir cette exigence.
Préparation
Les packages JAR qui doivent être dépendants pour les annotations personnalisées incluent AspectJrt-xxx.jar, AspectJWeaver-xxx.jar et XXX représente le numéro de version.
Annotations personnalisées
Un package de journaux séparé est créé dans le cadre du projet pour stocker le contenu lié au journal
**. Common.log.annotation // Emplacement de stockage d'annotation personnalisée **. Common.log.aop // Lieu de stockage des outils AOP
Créez une nouvelle classe d'annotation personnalisée sous le package d'annotation:
Package **. 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 XxxOperateLog {/ ** * Type d'opération Description * @return * / String OperateTypeDesc () Default ""; / ** * Type d'opération * @return * / long opérateType () par défaut -1; / ** * Encodage du module * @return * / string MousEcode () par défaut "M30"; / ** * Nom du module * @return * / string Mousename () par défaut "xx module"; / ** * Type d'entreprise * @return * / string Busstype () Default ""; / ** * Type d'entreprise Description * @return * / String BusstyPedesc () par défaut "";}Créez un nouveau XXXOperateLogaop sous le package AOP
package **. Common.log.aop; import **; // omettre @ aspect @ composantpublic classe xxxoperateLogaop {@Autowired SystemLogService SystemLogService; HttpServLetRequest request = null; Logger logger = loggerfactory.getLogger (xxxoperateLogaop.class); ThreadLocal <long> time = new ThreadLocal <long> (); // ID unique utilisé pour générer des journaux d'opération, utilisés pour appeler le public statique pour les journaux d'audit des processus métier threadLocal <string> tag = new ThreadLocal <string> (); // Déclare le point d'entrée AOP, toute méthode qui utilise xxxoperateLog est interceptée @PointCut ("@ annotation (**. Common.log.annotation.xxxoperateLog)") public void log () {System.out.println ("Je suis un point d'entrée"); } / ** * Coupez dans tous les endroits marqués @ log * @param joinpoint * / @before ("log ()") public void beforeExec (joinpoint joinpoint) {time.set (System.currenttimemillis ()); info (joinpoint); // Définissez le numéro d'identification unique des enregistrements de journal tag.set (uUid.randomuuid (). ToString ()); request = ((servLetRequestAttributes) requestContexTholder.getRequestAttributes ()). getRequest (); } @After ("log ()") public void AfterExec (joinpoint joinpoint) {MethodsIgnature ms = (méthodignature) joinpoint.getSignature (); Méthode méthode = Ms.GetMethod (); logger.debug ("tag as" + tag.get () + "méthode" + méthode.getName () + "Run consommation" + (system.currentTimemillis () - time.get ()) + "ms"); } // Dans le processus d'exécution de la méthode cible, cette méthode sera exécutée et la journalisation peut être implémentée ici @Around ("log ()") Objet public autour de l'Exec (ProcedingJoinpoint PJP) lance Throwables {object ret = pjp.proceed (); essayez {objet [] orgs = pjp.getargs (); SystemLog ValuereTurn = NULL; for (int i = 0; i <orgs.length; i ++) {if (orgs [i] instanceof SystemLog) {ValueReturn = (SystemLog) orgs [i]; }} if (valgueReturn == NULL) {ValueReturn = new SystemLog (); } if (ValuereTurn! = null && request! = null) {Methodsignature ms = (Methodsignature) pjp.getSignature (); Méthode méthode = Ms.GetMethod (); // Obtenez les informations sur le journal de l'opération de l'annotation xxxoperateLog log = méthode.getAnnotation (xxxoperateLog.class); String BusinessType = Log.BusSType (); String BusinessDesc = Log.BusStyPeDesC (); Hashmap requestmap = servleTutils.getParameterstohashmap (demande); // Recherchez le type d'entreprise à partir de paramètres if (businessype.equals ("")) {objet objbusinessype = requestmap.get ("business_type"); BusinessType = objbusinessype == null? "": objbusinessype.toString (); } // a trouvé le type d'entreprise à partir du formulaire d'application pour l'objet de résultat d'exécution appliquer = request.getAttribute ("appliquer"); if (appliquer! = null) {jsonObject obj = jsonfactory.tojsonAbStractAntity (appliquer); if (obj! = null) {valurereturn.setotherDesc ("appliquer le numéro:" + obj.getString ("applicable_no")); if (BusinessType.Equals ("")) {BusinessType = obj.getString ("Business_Type"); }}} // Trouver le type d'entreprise à partir des paramètres du processus d'exécution de la méthode (généralement définie manuellement) if (BusinessType.equals ("")) {BusinessType = (String) request.getAttribute ("Business_Type"); BusinessType = BusinessType == null? "": BusinessType; } if (! BusinessType.equals ("") && BusinessDesc.equals ("")) {BusinessDesc = xxxSysConstant.business_type.getName (BusinessType); } ValuereTurn.SetBusStype (xxxsysConstant.business_type.getNumber (BusinessType)); ValuereTurn.SetBusStyPedesc (BusinessDesc); ValueReturn.SetMoudleCode (log.moudleCode ()); ValueReturn.SetMoudLename (log.moudLename ()); Valuereturn.SetOperaSult (xxxsysConstant.yesorno.yes); ValueReturn.SetOperateType (log.operateType ()); ValuereTurn.SetInputUserId (((userConText) webutils.getSessionAttribute (request, "xxxuserContext")). getySuser (). getID ()); ValueReturn.SetOperateTypeDesC (log.OperateTypeDesC ()); ValueReturn.SetRequeStip (getReMoteHost (demande)); ValueReturn.SetRequestUrl (request.getRequestruri ()); ValueReturn.SetServerip (request.getLocalAddr ()); ValueReturn.SetUids (tag.get ()); // Enregistrer l'opération Log SystemLogService.SavesystemLog (ValuereTurn); } else {logger.info ("ne pas enregistrer les informations du journal"); } // Enregistrer le résultat de l'opération} catch (exception e) {e.printStackTrace (); } return return; } // Enregistrer le journal d'exception @AfterThrowing (PointCut = "log ()", throwing = "e") public void doafterThrowing (joinpoint joinpoint, throwable e) {try {info (joinpoint); Objet [] orgs = joinpoint.getArgs (); SystemLog ValuereTurn = NULL; for (int i = 0; i <orgs.length; i ++) {if (orgs [i] instanceof SystemLog) {ValueReturn = (SystemLog) orgs [i]; }} if (valgueReturn == NULL) {ValueReturn = new SystemLog (); } if (ValuereTurn! = null && request! = null) {MethodsIgnature ms = (méthodesignature) joinPoint.getSignature (); Méthode méthode = Ms.GetMethod (); XxxOperateLog log = méthode.getAnnotation (xxxoperatelog.class); String BusinessType = Log.BusSType (); String BusinessDesc = Log.BusStyPeDesC (); if (businessype.equals ("")) {objet objbusinessype = servletutils.getParameterstoHashMap (request) .get ("business_type"); BusinessType = objbusinessype == null? "": objbusinessype.toString (); BusinessDesc = xxxSysConstant.Business_Type.getName (BusinessType); } ValuereTurn.SetBusStype (xxxsysConstant.business_type.getNumber (BusinessType)); ValuereTurn.SetBusStyPedesc (BusinessDesc); ValueReturn.SetMoudleCode (log.moudleCode ()); ValueReturn.SetMoudLename (log.moudLename ()); ValueReturn.SetOperateType (log.operateType ()); ValueReturn.SetOperateTypeDesC (log.OperateTypeDesC ()); ValuereTurn.SetInputUserId (((userConText) webutils.getSessionAttribute (request, "xxxuserContext")). getySuser (). getID ()); ValuereTurn.SetOperaSult (xxxsysConstant.yesorno.No); String errmes = e.getMessage (); if (errMes! = null && errmes.length ()> 800) {errmes = errmes.substring (0, 800); } ValuereTurn.SetEterRormessage (errMes); ValueReturn.SetRequeStip (getReMoteHost (demande)); ValueReturn.SetRequestUrl (request.getRequestruri ()); ValueReturn.SetServerip (request.getLocalAddr ()); ValueReturn.SetUids (tag.get ()); SystemLogService.Savesystemlog (ValuereTurn); } else {logger.info ("Aucune information de journal n'est enregistrée"); }} catch (exception e1) {e1.printStackTrace (); }} Info private void (joinpoint joinpoint) { logger.debug("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Object[] OS = jointure.getargs (); Logger.Debug ("Sourcelocation: / T" + JOINGPOINT.getsourcelocation ()); logger.debug("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- request.getheader ("proxy-client-ip");} if (ip == null || ip.length () == 0 || "inconnu" .qualSigorecase (ip)) {ip = request.getheader (wl-proxy-cllient-ip "); "Unknown" .EqualsInGoreCase (ip)) {ip = request.getReMoteaddr ();} return ip.equals ("0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 0: 1")? "127.0.0.1": IP;Modifiez le fichier de configuration Spring-Mvc.xml et ajoutez la configuration suivante
<! - Activez l'interception AOP -> <aop: AspectJ-Autoproxy Proxy-Target-Class = "True" /> <Mvc: Annotation-Driven /> <! - Définissez la portée de la description de printemps Bean -> <Context: Component-Scan Base-Package = "**.. expression = "org.springframework.sterreotype.controller" /> </ context: composant-scan>
Il convient de noter que la configuration ci-dessus doit être placée dans le même fichier XML, soit Spring-Mvc.xml ou Spring-Context.xml, sinon il peut ne pas prendre effet, et la raison n'a pas encore été trouvée.
Utilisation des annotations
@XxxoperateLog (busstype = xxxsysConstant.business_type.yyyy, busstypedesc = "Type d'entreprise Description", OperateType = xxxsysConstant.LogoperateType.Query, OperateTypeDesc = "Operation Description") @requestmapping (value = "/**/**/Queryxxxx4DataRid.J RequestMethod.Post) public void queryxxxxx4datagrid (httpservletRequest request, httpservletResponse arg1, modèle modèle, écrivain écrivain) { logger.info("============================================================================================= HttpServletResponse arg1, Model model, Writer écrivain) {Logger.info ("============================== HttpservletResponse Arg1, modèle modèle, écrivain) {Logger.info (" ====================== HTTPSERSERRESPERS Logger.info ("=================== HttpservletResponse Arg1, modèle modèle, écrivain écrivain) {Logger.info (" ================= HttpservletResponse Arg1, Model Model, écrivain) { Logger.info ("================== HttpservletResponse Arg1, modèle modèle, écrivain écrivain) {Logger.info (" ================= HttpservletResponse Arg1, modèle d'écrivain) {écrivain) { logger.info ("=================== HttpservletResponse Arg1, modèle modèle,L'annotation personnalisée SpringMVC ci-dessus, la méthode d'utilisation de l'AOP pour réaliser la journalisation est tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.