اليوم ما زلت في تنفيذ AOP. أنا شخصياً أعتقد أنها الطريقة الأكثر مرونة وقابلية التوسيع. خذ إدارة السجل كمثال ، باستخدام نموذج التعليقات التوضيحية المخصصة لـ Spring AOP لتنفيذ إدارة السجل. دون مزيد من اللغط ، ابدأ على الفور! ! !
سأقول مرة أخرى عن التكوين.
ماذا تضيف في ApplicationContext-mvc.xml
<MVC: تعرض التعليق التوضيحي /> <!-تنشيط وظيفة المسح الضوئي للمكونات ، فمسح مكونات المسح تلقائيًا من خلال التعليق التوضيحي ضمن الحزمة com.gcx وعلابها الفرعية-> <السياق: مكون الفسيرة الفقرية-proxy-package = "com.gcx" /> <! فئة الوكيل الهدف كاذبة بشكل افتراضي. إذا كان الفصل الخاص بك ينفذ الواجهة ، فانتقل إلى وكيل JDK. إذا لم يكن الأمر كذلك ، فانتقل إلى CGLIB Proxy-> <!-ملاحظة: يوصى باستخدام وكيل CGLIB لوضع الربح البسيط. على الرغم من أن الوكيل الديناميكي JDK أسرع من وكيل CGLIB ، فإن أدائه ليس جيدًا مثل cglib-> <!-إذا لم تكتب وكيل الوكيل- فئة "True" على ما يرام-> <aOP: SideJ-Autopproxy-target-class = "true"/>!
بعد ذلك ، ابدأ في كتابة الرمز.
إنشاء كيان السجل
الطبقة العامة systemlog {private string id ؛ وصف السلسلة الخاصة ؛ طريقة السلسلة الخاصة ؛ logType الطويل الخاص ؛ requestip سلسلة خاصة ؛ استثناء السلسلة الخاصة. سلسلة الاستثناء الخاصة بالسلسلة الخاصة ؛ السلسلة الخاصة معاملات ؛ سلسلة خاصة CreateBy. تاريخ خاص تم إنشاؤه ؛ السلسلة العامة getId () {معرف الإرجاع ؛ } public void setId (string id) {this.id = id == null؟ null: id.trim () ؛ } السلسلة العامة getDescription () {return description ؛ } public void setDescription (وصف السلسلة) {this.description = description == null؟ null: description.trim () ؛ } السلسلة العامة getMethod () {return method ؛ } public void setMethod (طريقة السلسلة) {this.method = method == null؟ null: method.trim () ؛ } public getLogtype () {return logtype ؛ } public void setlogtype (long logtype) {this.logtype = logType ؛ } السلسلة العامة getRequestip () {return requestip ؛ } public void setRequestip (string requestip) {this.requestip = requestip == null؟ NULL: requertip.trim () ؛ } السلسلة العامة getExceptionCode () {return inspectCode ؛ } public void setExceptionCode (string stiventCode) {this.exceptionCode = اثاتات dode == null؟ NULL: استثناء DODE.TRIM () ؛ } السلسلة العامة getExceptionDetail () {return inspectdetail ؛ } public void setExceptionDetail (سلسلة استثناء detail) {this.exceptionDetail = استثناء detail == null؟ NULL: استثناء detail.trim () ؛ } السلسلة العامة getParams () {return params ؛ } public void setParams (String params) {this.params = params == null؟ NULL: params.trim () ؛ } السلسلة العامة getCreateby () {return createBy ؛ } public void setCreateBy (String CreateBy) {this.createby = createBy == NULL؟ null: createBy.trim () ؛ } التاريخ العام getCreatedAte () {return createdAte ؛ } public void setCreatedAte (date createdate) {this.createdate = createTate ؛ }}كتابة واجهة داو
package com.gcx.dao ؛ import com.gcx.entity.systemlog ؛ public interface systemlogmapper {int deleteeBrimaryKey (string id) ؛ int insert (SystemLog Record) ؛ int insertSeertive (SystemLog Record) ؛ SystemLog SelectByPrimaryKey (معرف السلسلة) ؛ int updateByPrimaryKey (سجل SystemLog) ؛}كتابة طبقة خدمة
package com.gcx.service ؛ import com.gcx.entity.systemlog ؛ public interface systemlogservice {int deletesystemlog (string id) ؛ int insert (SystemLog Record) ؛ int inserttest (سجل systemlog) ؛ SystemLog SelectSystemLog (معرف السلسلة) ؛ int updatesystemlog (سجل SystemLog) ؛}اكتب خدمة فئة تطبيق الخدمة
package com.gcx.service.impl ؛ import javax.annotation.resource ؛ import org.springframework.stereotepee.service ؛ import com.gcx.annotation.log ؛ import com.gcx.dao.systemlogpper ؛ com.gcx.service.systemlogservice ؛ service ("SystemLogService") SystemLogServiceImpl تنفذ SystemLogService {resource systemlogmapper systemlogmapper ؛ Override public int deletesystemlog (string id) } Override public int insert (SystemLog Record) {return systemlogmapper.insertselective (record) ؛ } Override public SystemLog SechancyStemLog (string id) {return systemlogmapper.selectbyprimarykey (id) ؛ } Override public int updatesystemlog (سجل systemLog) {return systemlogmapper.updateByPrimaryKeySelective (record) ؛ } Override public int insertTest (سجل systemLog) {return systemlogmapper.insert (record) ؛ }}هنا انتهى البرنامج الأساسي
أدناه هو التعليق التوضيحي المخصص
Package com.gcx.annotation ؛ import java.lang.annotation.*؛ @target ({elementType.Parameter ، elementType.method}) retention (attreention.runtime) documented public interface log { / ** The type of the to to to to / ** العملية المحددة التي يتعين تنفيذها ، مثل: إضافة المستخدم **/ السلسلة العامة OperationName () افتراضي "" ؛}اكتب القطع أدناه
package com.gcx.annotation ؛ import java.lang.reflect.method ؛ import java.util.date ؛ import java.util.uuid ؛ import javax.annotation.resource ؛ import javax.servlet.http.httpletrequest ؛ import javax.servett. org.aspectj.lang.joinpoint ؛ import org.aspectj.lang.proceedingjoinpoint ؛ import org.aspectj.lang.annotation.after ؛ import org.aspectj.lang.annotation.afterreturning ؛ import org.aspectj.lang.annotation.afterthroing ؛ org.aspectj.lang.annotation.aspect ؛ import org.aspectj.lang.annotation.before ؛ import org.aspectj.lang.annotation.pointcut ؛ import org.slf4j.logger ؛ report org.slf4j.loggerfactory ؛ import org.springframework.stereponate.stereponte.sponte.slf4j.loggerfactory ؛ import org.springframework com.gcx.entity.systemlog ؛ استيراد com.gcx.entity.user ؛ استيراد com.gcx.service.systemlogservice ؛ استيراد com.gcx.util.jsonutil ؛/*** @Author yang jian* @ @mail SystemLogAspect {// حقن الخدمة لحفظ السجلات في قاعدة البيانات @Resource // أنا أستخدم شرح الموارد هنا ، بشكل عام باستخدام autowired. اختلافاتهم. إذا كان لدي وقت ، فسوف أكتب SystemLogService SystemLogService في المدونة اللاحقة ؛ private Static Final Logger Logger = loggerFactory.getLogger (SystemLogaspect. class) ؛ // وحدة تحكم طبقة tangent point @pointcut ("التنفيذ (* com.gcx.controller ..*.* (..)) System.out.println("====================================================================================================== =========================================================== =========================================================== =========================================================== =========================================================== =========================================================== ============================================================= System.out.println("========================================================================================== System.currentTimeMillis(); try { (proceedingJoinpoint). System.out.println("============================================================================ System.currentTimeMillis(); if(logger.isInfoEnabled()){ logger.info ("ound" + joinpoint + " /tuse time:" + (end - start) + "ms مع استثناء:" + e.getMessage ()) ؛ طلب Httpservletrequest = (ServletRequestatributes) = مستخدم جديد () ؛ class.forname (TargetName) ؛ method.getannotation (log.class) .operationtype () ؛ System.out.println ("طريقة الطلب:" + point.getTarget (). getClass (). System.out.println ("IP IP:" + IP) ؛ log.setMethod (joinpoint.getTarget (). getClass (). log.setparam (null) ؛ logger.error ("== استثناء ما بعد الإلغاء ==") ؛ تنفيذ وحدة التحكم بعد العودة =======) ؛ doafterthrowing (joinpoint joinpoint ، remable { /*httpservletrequest = (servletRequestattributes) //الحصول على طلب IP = request.getRemoteD () joinpoint.getargs () JoinPoint.getSignature () getName () ؛ method.getParameterty () ؛ System.out.println ("=================== DESICTION DESITORY ابدأ ================================================================================== ====================================================================================== ====================================================================================== ====================================================================================== System.out.println ("معلومات الاستثناء:" + E.GetMessage ()) ؛ system.out.println ("requester:" + user.getName () ؛ log.setid (uuid.randomuid (). log.setMethod (JoinPoint.getTarget () SystemLogService.insert (log) ؛ ex.getMessage ()) ؛ E.GetClass (). getName () ، e.getClass ().لقد كتبت الكثير هنا ، بما في ذلك ما قبل الإخطار ، والإخطار المحيط ، وبعد الإخطار ، وإخطار الاستثناء ، وإخطار ما بعد الوجبة. لا بأس إذا لم أكتب كل شيء في كتابتنا الفعلية. أنا معتاد على كتابة منطق التسجيل في مرحلة ما بعد السمية. أرى أن بعض إشعارات ما قبل السطوع مدرجة أيضًا في إشعارات ما قبل السمية على الإنترنت ، لكنني أشعر أنه من الأفضل كتابتها في إشعارات ما بعد السمية.
لنبدأ في إضافة تعليقات مخصصة إلى وحدة التحكم! !
package com.gcx.controller ؛ استيراد org.springframework.beans.factory.annotation.autowired ؛ استيراد org.springframework.stereotype.controller com.gcx.service.userservice ؛@controller@requestMapping ("USERCONTROLLER") الفئة العامة USERCONTROLLER requestmapping ("testaop") log (operationType = "Add Operation:" ، OperationName = "Add user") public void testaop (string username ، string password) {userservice.adduser (username ، password) ؛ }}اكتب فئة الاختبار أدناه
test public void testaop1 () {// ابدأ Spring Container ApplicationContext CTX = جديد classpathxmlapplicationContext (سلسلة جديدة [] {"classpath: applicationContext-mvc.xml" ، "classPath: ApplicationContext-datasource.xml"}) ؛ // احصل على خدمة أو وحدة تحكم USERCONTROLLER USERCONTROLLER = (USERCONTROLLER) CTX.GetBean ("USERCONTROLLER") ؛ UserController.testaop ("Zhangsan" ، "123456") ؛ }بيانات قاعدة البيانات:
أردت أصلاً أن أكتب نقطتين من الظل ، إحداها هي طبقة الخدمة والآخر هو طبقة وحدة التحكم. يتم استخدام طبقة الخدمة لتسجيل معلومات الاستثناء ، بينما يتم استخدام طبقة وحدة التحكم لتسجيل الوظائف. النتيجة الجري على النحو التالي.
إذا قمت بذلك ، فلا أعرف ما إذا كانت كفاءة التشغيل جيدة في المشروع الفعلي. يرجى الاطلاع على مدونة Daniu هنا لتقديم بعض الاقتراحات! !
المثال أعلاه التفسير لطريقة التعليقات التوضيحية المخصصة لـ Spring AOP لتنفيذ إدارة السجل هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.