Erforderungshintergrund
In einem kürzlich durchgeführten Projekt schlug der Kunde nach Abschluss des Projekts vor, die Protokolle aller Geschäftsvorgänge in die Datenbank aufzuzeichnen und einige wichtige Geschäftsinformationen (z. B. Transaktionsauftragsnummern) im Protokoll zu extrahieren.
Um den Bauzeitraum nach der Überprüfung der Informationen zu gewährleisten, habe ich beschlossen, AOP + benutzerdefinierte Anmerkungen zu verwenden, um diese Anforderung zu erfüllen.
Vorbereitung
Zu den JAR-Paketen, von denen für benutzerdefinierte Anmerkungen abhängig sein müssen, gehören Aspektjrt-xxx.jar, Aspektjweaver-xxx.jar und XXX die Versionsnummer.
Benutzerdefinierte Anmerkungen
Unter dem Projekt wird ein separates Protokollpaket erstellt, um Protokollinhalte zu speichern
**. Common.log.Annotation // benutzerdefinierte Annotationsspeicherort **. Common.log.aop // AOP -Werkzeugspeicherort
Erstellen Sie eine neue benutzerdefinierte Annotationsklasse unter dem Annotationspaket:
Paket **. Common. Xxxoperatelog { / *** Betriebstyp Beschreibung* @return* / String operatetypedesc () Standard ""; / *** Betriebstyp* @return*/ long operatetype () Standard -1; / *** Modulcodierung* @return*/ String mousecode () Standard "M30"; / *** Modulname* @return*/ String MouSeName () Standard "xx Modul"; / *** Geschäftstyp* @return*/ String busstype () Standard ""; / *** Geschäftstyp Beschreibung* @Return*/ String busstypedesc () Standard "";}Erstellen Sie einen neuen XXXOperatelogaop unter dem AOP -Paket
Paket **. Common.log.aop; Import **; // @Aspekt @componentpublic Klasse xxxoperatelogaop {@autowired SystemLogService SystemLogService; HttpServletRequest request = null; Logger logger = loggerfactory.getLogger (xxxoperatelogaop.class); ThreadLocal <Long> time = new ThreadLocal <Long> (); // Einzigartige ID zum Generieren von Betriebsprotokollen, die zum Aufrufen von öffentlichem statischen für Business Process Audit -Protokolls ThreadLocal <string> Tag = New ThreadLocal <string> (); // Deklarieren Sie den AOP -Einstiegspunkt, jede Methode, die xxxoperatelog verwendet, wird @pointCut (" @Annotation (**. Common.log.annotation.xxxxoperatelog)") public void log () {System.out.println ("i AM ein Einstiegspunkt"). } / *** an allen Orten geschnitten @log* @param joins* / @before ("log ()") public void voranexec (joinpoint Joinpoint) {time.set (System.CurrentTimemillis ()); Info (joinpoint); // Setzen Sie die eindeutige Identifikationsnummer von Protokolldatensätzen tag.set (uUid.randomuuid (). ToString ()); request = ((servletRequestattributes) RequestContexTHolder.getRequestAttributes ()). getRequest (); } @After ("log ()") public void ateExec (joinpoint joinpoint) {MethodenIntation ms = (methodeInt) joinpoint.getSignature (); Methode Methode = FrauGetMethod (); logger.debug ("tag as" + tag.get () + "method" + method.getName () + "Verbrauch laufen" + (System.currentTimemillis () - time.get ()) + "ms"); } // Im Prozess der Ausführung der Zielmethode wird diese Methode ausgeführt, und die Protokollierung kann hier implementiert werden. try {object [] orgs = pjp.getargs (); SystemLog ValuerTurn = null; für (int i = 0; i <orgsgtal; }} if (valuerTurn == null) {valuerTurn = new SystemLog (); } if (valuerTurn! = null && request! Methode Methode = FrauGetMethod (); // Die Betriebsprotokollinformationen der Annotation xxxoperatelog log = methode.getannotation (xxxoperatelog.class) erhalten; String businessType = log.busstype (); String businessDesc = log.busstypedesc (); HashMap RequestMap = ServletUtils.getParameterStoHasMap (Anfrage); // Suchen Sie nach Geschäftstypen aus Parametern if (BusinessType.equals ("") {Object ObjbusinessType = RequestMap.get ("business_type"); BusinessType = objbusinessType == null? "": objbusinessType.toString (); } // den Geschäftstyp aus dem Antragsformular für das Ausführungsergebnisobjekt anwenden = request.getAttribute ("anwenden"); if (anwenden! if (obj! if (businessType.equals ("")) {BusinessType = obj.getString ("Business_Type"); }}} // den Geschäftstyp aus den Ausführungsprozessparametern der Methode (normalerweise manuell eingestellt) if (BusinessType.equals ("") {BusinessType = (String) request.getAtTribute ("business_type"); BusinessType = BusinessType == NULL? "": BusinessType; } if (! BusinessType.equals ("") && businessDesc.equals ("") {businessDesc = xxxsysConstant.business_type.getName (BusinessType); } ValuerTurn.setBusstype (xxxsysConstant.business_type.getNumber (businessType)); ValuerTurn.SetBusstypedesc (businessDesc); ValuerTurn.SetMoudleCode (log.moudleCode ()); ValuerTurn.SetMoudLename (log.moudlename ()); ValuerTurn.Setoperateresult (xxxsysConstant.yesorno.yes); ValuerTurn.Setoperatetyp (log.operatetype ()); ValuerTurn.SetInputUSerId (((userContext) webutils.getSessionAttribute (Anfrage, "xxxUserContext")). GetSySuSer (). getId ()); ValuerTurn.Setoperatetypedesc (log.operatetypedesc ()); ValuerTurn.SetRequestip (GetRemotehost (Anfrage)); ValuerTurn.SetRequesturl (Request.GetRequesturi ()); ValuerTurn.SetServerip (Request.GetLocalAddr ()); ValuerTurn.SetUids (tag.get ()); // Speichern Sie den Betriebsprotokoll systemLogService.SavesSystemLog (ValuerTurn); } else {logger.info ("keine Protokollinformationen aufzeichnen"); } // das Operationsergebnis speichern} catch (Ausnahme e) {e.printstacktrace (); } return return; } // Ausnahmeprotokoll @Afterthrowing (pointCut = "log ()", throwing = "e") public void Doafterthrowing (joinpoint joinpoint, Throwable e) {try {info (joinpoint); Object [] orgs = joinpoint.getargs (); SystemLog ValuerTurn = null; für (int i = 0; i <orgsgtal; }} if (valuerTurn == null) {valuerTurn = new SystemLog (); } if (valuerTurn! = null && request! Methode Methode = FrauGetMethod (); Xxxoperatelog log = methode.getAnnotation (xxxoperatelog.class); String businessType = log.busstype (); String businessDesc = log.busstypedesc (); if (businessType.equals ("")) {Object ObjbusinessType = servletutils.getParameterStoHasMap (Anfrage) .get ("business_type"); BusinessType = objbusinessType == null? "": objbusinessType.toString (); businessDesc = xxxsysConstant.business_type.getName (BusinessType); } ValuerTurn.setBusstype (xxxsysConstant.business_type.getNumber (businessType)); ValuerTurn.SetBusstypedesc (businessDesc); ValuerTurn.SetMoudleCode (log.moudleCode ()); ValuerTurn.SetMoudLename (log.moudlename ()); ValuerTurn.Setoperatetyp (log.operatetype ()); ValuerTurn.Setoperatetypedesc (log.operatetypedesc ()); ValuerTurn.SetInputUSerId (((userContext) webutils.getSessionAttribute (Anfrage, "xxxUserContext")). GetSySuSer (). getId ()); ValuerTurn.Setoperateresult (xxxsysConstant.yesorno.no); String errmes = e.getMessage (); if (errmes! = null && errmes.length ()> 800) {errmes = errmes.substring (0, 800); } ValuerTurn.Seterrormessage (Errmes); ValuerTurn.SetRequestip (GetRemotehost (Anfrage)); ValuerTurn.SetRequesturl (Request.GetRequesturi ()); ValuerTurn.SetServerip (Request.GetLocalAddr ()); ValuerTurn.SetUids (tag.get ()); SystemLogService.SavesystemLog (ValuerTurn); } else {logger.info ("Keine Protokollinformationen werden aufgezeichnet"); }} catch (Ausnahme e1) {e1.printstacktrace (); }} private void Info (joinpoint JoinPoint) { logger.debug ("---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- os = joinpoint.getargs (); logger.debug ("Sourcelocation:/t" + joinpoint.getSourcelocation ()); logger.debug ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Request.Getheader ("Proxy-Client-IP"); IP = Request.GetRemoteaddr ();Ändern Sie die Konfigurationsdatei Spring-mvc.xml und fügen Sie die folgende Konfiguration hinzu
<!-AOP-Abfangen einschalten-> <AOP: Aspektj-autoproxy proxy-target-class = "true" /> <mvc: Annotationssteuer /> <!-Definieren Sie den Bereich der Frühlingsbeschreibung Bean-> <context: component-scan base-package = "**. Expression = "org.springframework.stereotype.Controller"/> </context: component-scan>
Es ist zu beachten, dass die obige Konfiguration in derselben XML-Datei entweder Spring-mvc.xml oder Spring-Context.xml platziert werden muss, da sie sonst möglicherweise nicht wirksam wird, und der Grund wurde noch nicht gefunden.
Verwendung von Anmerkungen
@XXXOperateLog( bussType=XXXSysConstant.BUSINESS_TYPE.YYYY,bussTypeDesc="Business Type Description" ,operateType = XXXSysConstant.LogOperateType.QUERY,operateTypeDesc = "Operation Description" ) @RequestMapping(value = "/**/**/queryXXXX4DataGrid.json", method = RequestMethod.Post) public void queryxxxxxx4datagrid (httpServletRequest Request, httpServletResponse Arg1, Modellmodell, Schriftstellerautor) { 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, Model model, Writer writer) { 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, Modellmodell,Die obige SpringMVC -Annotation, die Methode zur Verwendung von AOP zur Realisierung von Protokollierung ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.