Heute implementiere ich weiterhin AOP. Ich persönlich denke, es ist der flexibelste und erweiterbarste Weg. Nehmen Sie als Beispiel die Protokollverwaltung an, indem Sie das Feder AOP -benutzerdefinierte Annotationsformular zur Implementierung der Protokollverwaltung verwenden. Beginnen Sie ohne weiteres sofort! ! !
Ich werde noch einmal über die Konfiguration sagen.
Was fügen Sie in ApplicationContext-mvc.xml hinzu
<MVC: Annotationsgetrieben /> <!-Aktivieren Sie die Komponenten-Scanfunktion, scannen automatisch Komponenten, die durch Annotation unter Paket com.gcx und seine Unterpackungen konfiguriert sind-> <Kontext: Komponenten-scan-Basis-Package = "Com.gcx" /> <! Die Proxy-Target-Klasse ist standardmäßig falsch. Wenn Ihre Klasse die Schnittstelle implementiert, gehen Sie zu JDK -Proxy. Wenn nicht, gehen Sie zu CGGLIB Proxy-> <!-Hinweis: Es wird empfohlen, CGGLIB-Proxy für den einfachen Gewinnmodus zu verwenden. Obwohl JDK Dynamic Proxy schneller als CGGLIB-Proxy ist, ist seine Leistung nicht so gut wie Cglib-> <!-Wenn Sie nicht proxy-target-class = "true" Der Satz ist ok-> <AOP: Aspekt: Aspektj-Autopproxy Proxy-Target-Class = "True" <!-Abschnitt-> <
Schreiben Sie als nächstes den Code.
Erstellen Sie eine Protokollentität
öffentliche Klasse SystemLog {private String -ID; private Zeichenfolge Beschreibung; private String -Methode; privat langer logtype; private String Requestip; private String -Ausnahmecode; private String ExceptionDetail; private String -Parameter; private String createBy; privates Datum erstellt; public String getid () {return id; } public void setID (String -ID) {this.id = id == null? null: id.trim (); } public String getDescription () {Rückgabe Beschreibung; } public void setDescription (String Beschreibung) {this.description = Beschreibung == NULL? NULL: Beschreibung.Trim (); } public String getMethod () {Rückgabemethode; } public void setMethod (String -Methode) {this.method = method == null? null: method.trim (); } public long getlogtType () {return logType; } public void setlogtType (langer logType) {this.logtType = logType; } public String getRequestip () {return requestip; } public void setRequestip (String Requestip) {this.requestip = requestip == null? null: Requestip.trim (); } public String getExceptionCode () {return exceptionCode; } public void setExceptionCode (String -ExceptionCode) {this.exceptionCode = exceptionCode == null? NULL: AUCECTCODE.TRIM (); } public String getExceptionDetail () {return ExceptionDetail; } public void setExceptionDetail (String ExceptionDetail) {this.exceptionDetail = exceptionDetail == null? NULL: ExceptionDetail.trim (); } public String getParams () {return params; } public void setParams (String -Params) {this.params = params == null? null: params.trim (); } public String getCreateby () {return createBy; } public void setCreateby (String createBy) {this.createby = createBy == null? null: createBy.trim (); } public date getCreatedate () {return createdate; } public void setCreatedate (Datum erstellt) {this.createdate = createdate; }}Schreiben einer Dao -Schnittstelle
Paket com.gcx.dao; import com.gcx.entity.SystemLog; öffentliche Schnittstelle SystemLogMapper {int DeleteByprimaryKey (String -ID); Int Insert (SystemLog -Datensatz); int InsertSelective (SystemLog -Datensatz); SystemLog SelectByprimaryKey (String -ID); int updateByprimaryKey (SystemLog -Datensatz);}Schreiben einer Serviceschicht
Paket com.gcx.service; import com.gcx.entity.SystemLog; öffentliche Schnittstelle SystemLogService {int DeleteSystemLog (String -ID); Int Insert (SystemLog -Datensatz); int InsertTest (SystemLog -Datensatz); SystemLog SelectSystemLog (String -ID); Int UpdatesSystemLog (SystemLog -Datensatz);}Schreiben Sie Service Implementierungsklassen ServiceImpl
Paket com.gcx.service.impl; importieren javax.annotation com.gcx.service.SystemLogService; @Service ("SystemLogService") öffentliche Klasse SystemLogServiceImpl implementiert SystemLogService {@resource private systemLogmapper systemLogMapper; @Override public int DeleteSystemLog (String -ID) {return SystemLogMapper.DeletByprimaryKey (ID); } @Override public int Insert (SystemLog -Datensatz) {return SystemLogMapper.insertSelective (Datensatz); } @Override public SystemLog selectSystemLog (String -ID) {return SystemLogMapper.SelectByprimaryKey (ID); } @Override public int updateSystemLog (SystemLog -Datensatz) {return SystemLogMapper.UpdateByprimaryKeysselective (Record); } @Override public int InsertTest (SystemLog -Datensatz) {return SystemLogMapper.insert (Datensatz); }}Hier ist das grundlegende Programm abgeschlossen
Unten finden Sie die benutzerdefinierte Annotation
Paket com.gcx.annotation; import Java.lang.Annotation.*; @target ({elementtype.parameter, elementtype.method}) @retention (retentionpolicy.runtime) @Documented public @Interface -Protokoll { / ** Die Art der Operation, die durchgeführt wird, wie folgt: addiert ** / Public Operation ** / Public -Operation addiert ** / öffentlich -String -Operation add ** / strating -operation (). / ** Der spezifische Operation, der ausgeführt wird, wie z. B. Benutzer hinzufügenSchreiben Sie den Schnitt unten
Paket com.gcx.Annotation; import Java.lang.reflect.method; import Java.util.date; import Java.util.UUid; import Javax.annotation org.aspespectj.lang.joinpoint; import org.aspespectj.lang.proceedingjoinpoint; import org.aspespedj.lang.Annotation.after; org.aspespectj.lang.Annotation.aspep; import org.aspespectj.lang.Annotation com.gcx.entity.SystemLog; import com.gcx.entity.user; import com.gcx.service Klasse*/ @Aspekt @componentpublic class systemLogaspect {// Inject -Dienst zum Speichern von Protokollen in der Datenbank @Resource // Ich verwende hier die Annotation von Ressourcen, wobei @Autowired im Allgemeinen. Ihre Unterschiede. Wenn ich Zeit habe, werde ich private SystemLogService SystemLogService im nachfolgenden Blog schreiben. private statische endgültige Logger logger = loggerFactory.getLogger (SystemLogaspect. Klasse); // Controller Layer Tangent Point @pointCut ("Execution (* com.gcx.controller ..*. System.out.println("====================================================================================================== ================================================================= ================================================================= ================================================================= ================================================================= ================================================================= =================================================================== System.out.println("========================================================================================== System.currentTimeMillis(); try { ((ProsseingJoInpoint). System.out.println ("=========================================================================== -CurentTimemillis (); logger.info ("um" + joinpoint + " /tuse Zeit:" + (Ende - Start) + "MS mit Ausnahme:" + e.getMessage ()); HttpServletRequest -Anforderung = (ServletRequestattributes) RequestContexTHOLDER.GetRequestattributes ()). GetRequest (); user = new user () user.setId (1); Class.forname (targetName); method.getannotation (log.class) .operationType (); System.out.println ("Anforderungsmethode:" + (joinpoint.gettarget (). GetClass (). GetName () + ". System.out.println ("Anfrage IP:" + IP); log.setMethod (joinpoint.gettarget (). GetClass (). GetName () + ". Log.SetParams (NULL); logger.Error ("== postnotification Exception =="); Controller nach der Return Benachrichtigung =======); Doafterthring (joinpoint joinpoint, Throwable E) { /*httpServletRequest Request = (ServletRequestAttributes) RequestContextHolder.getRequestattributes (). GetRequest (); Session.getAttribute (Webconstants.Current_User); (joinpoint.getArgs ()! joinpoint.gettarget (). if (method.getName (). Equals (MethodName)) {class [] clazzs = method.getParameterTypes (); /*============== Konsolenausgabe ==========* / system.out.println ("================ Ausnahmebenachrichtigung start======================================================================================= ======================================================================ieben ======================================================================ieben ======================================================================ieben System.out.println ("Ausnahmeinformationen:" + e.getMessage ()); System.out.println ("Anforderer:" + user.getName ()); log.setId (uUid.randomuuid (). toString ()); log.setMethod (joinpoint.gettarget () GetClass (). GetName () + " SystemLogService.insert (log); ex.getMessage ()); E.GetClass (). GetName (), E.GetClass (). GetName (), Params);Ich habe hier viel geschrieben, einschließlich Vorabbeugung, Surround-Benachrichtigung, Post-Notice, Ausnahmemuchung und Benachrichtigung über die Nachmesser. Es ist okay, wenn ich alles in unserem tatsächlichen Schreiben nicht schreibe. Ich bin es gewohnt, die Logik der Protokollierung im Post-Log zu schreiben. Ich sehe, dass einige der Benachrichtigungen vor dem Log auch in den Benachrichtigungen vor dem Log im Internet enthalten sind, aber ich bin der Meinung, dass es besser ist, sie in die Post-Log-Benachrichtigungen zu schreiben.
Fügen wir dem Controller benutzerdefinierte Anmerkungen hinzu! !
Paket com.gcx.controller; import org.springframework.bean.factory.annotation com.gcx.service.userService;@controller@requestmapping ("usercontroller") öffentliche Klasse UserController {@autowired private userservice userservice; @RequestMapping ("testaop") @log (OperationType = "Operation:", OperationName = "Benutzer hinzufügen") public void testaop (String -Benutzername, String -Passwort) {UserService.adDuser (Benutzername, Passwort); }}Schreiben Sie die Testklasse unten
@Test public void testaop1 () {// Spring Container applicationContext ctx = new classPhodexMlApplicationContext (neuer String [] {"classPath: applicationContext-mvc.xml", "classPath: applyContext-datasource.xml"}); // Service- oder Controller -Komponenten -UserController -UserController = (UserController) ctx.getbean ("UserController"); UserController.Testaop ("Zhangsan", "123456"); }Datenbankdaten:
Ich wollte ursprünglich zwei Tangentenpunkte schreiben, eine ist die Serviceschicht und die andere ist die Controller -Ebene. Die Serviceschicht wird verwendet, um Ausnahmeinformationen aufzuzeichnen, während die Controller -Ebene zum Aufzeichnen von Funktionen verwendet wird. Das laufende Ergebnis ist wie folgt.
Wenn Sie dies tun, weiß ich nicht, ob die Betriebseffizienz im tatsächlichen Projekt gut ist. Bitte sehen Sie den Daniu des Blogs hier, um einige Vorschläge zu geben! !
Die obige Beispielerläuterung für die maßgeschneiderte Annotationsmethode für den Spring AOP zur Implementierung der Protokollverwaltung 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.