متطلبات خلفية
في مشروع حديث ، عند اكتمال المشروع بشكل أساسي ، اقترح العميل تسجيل سجلات جميع العمليات التجارية في قاعدة البيانات واستخراج بعض معلومات العمل الرئيسية (مثل أرقام أوامر المعاملات) في السجل.
من أجل ضمان فترة البناء ، بعد مراجعة المعلومات ، قررت استخدام التعليقات التوضيحية المخصصة AOP + لإكمال هذا المتطلبات.
تحضير
تتضمن حزم JAR التي تحتاج إلى الاعتماد عليها للتعليقات التوضيحية المخصصة SideJrt-xxx.jar و SideJweaver-Xxx.jar و XXX تمثل رقم الإصدار.
التعليقات التوضيحية المخصصة
يتم إنشاء حزمة سجل منفصلة ضمن المشروع لتخزين المحتوى المتعلق بالسجل
**.
قم بإنشاء فئة شرح مخصصة جديدة ضمن حزمة التعليقات التوضيحية:
حزمة **. XXXOPERATELOG { / *** نوع التشغيل الوصف* return* / string operAtypedesc () افتراضي "" ؛ / *** نوع العملية* regurn*/ long operateType () افتراضي -1 ؛ / *** وحدة الترميز* regurn*/ string mousecode () افتراضي "M30" ؛ / *** اسم الوحدة النمطية* return*/ string mousename () الافتراضي "XX Module" ؛ / *** type business* @return*/ string busStype () افتراضي "" ؛ / *** الوصف نوع الأعمال* @REGRINT*/ String BusStypedesc () افتراضي "" ؛}قم بإنشاء XXXOPERATELOGAOP جديد ضمن حزمة AOP
حزمة **. طلب httpservletrequest = فارغ ؛ logger logger = loggerfactory.getLogger (xxxoperatelogaop.class) ؛ threadlocal <trong> time = new threadlocal <Brong> () ؛ // معرف فريد يستخدم لإنشاء سجلات التشغيل ، المستخدمة للاتصال بالثبات العام لسجلات التدقيق في عملية الأعمال ThreadLocal <string> tag = new threadlocal <string> () ؛ // إعلان نقطة إدخال AOP ، يتم اعتراض أي طريقة تستخدم XXXOPERATELOG ( @" @enoTation (**. } / *** CUT في جميع الأماكن التي تم وضع علامة @log* param JoinPoint* / before ("log ()") public void قبل joinpoint joinpoint) {time.set (System.CurrentTimEmillis ()) ؛ معلومات (JoinPoint) ؛ // قم بتعيين رقم التعريف الفريد لسجلات السجل tag.set (uuid.randomuuid (). toString ()) ؛ request = ((servletRequestAtTributes) requestContexTholder.getRequestAttributes ()). getRequest () ؛ } apter ("log ()") public void afterexec (JoinPoint joinpoint) {methodsignature ms = (methodsignature) joinpoint.getSignature () ؛ طريقة طريقة = ms.getMethod () ؛ logger.debug ("tag as" + tag.get () + "method" + method.getName () + "Run Consumption" + (System.CurrentTimeMillis () - time.get ()) + "MS") ؛ } // في عملية تنفيذ طريقة الهدف ، سيتم تنفيذ هذه الطريقة ، ويمكن تنفيذ التسجيل هنا @AROUND ("log ()) ounderexec (proseingJoinpoint PJP) يلقي رمي {كائن retr = pjp.proceed () ؛ حاول {object [] orgs = pjp.getargs () ؛ SystemLog Valuereturn = null ؛ لـ (int i = 0 ؛ i <orgs.length ؛ i ++) {if (orgs [i] eastyof systemlog) {valuereturn = (systemlog) orgs [i] ؛ }} if (valuereturn == null) {valuereturn = new SystemLog () ؛ } if (valuereturn! = null && request! = null) {methodsIngureature ms = (methodsIgnature) pjp.getSignature () ؛ طريقة طريقة = ms.getMethod () ؛ // احصل على معلومات سجل التشغيل الخاصة بسجل التعليق التوضيحي xxxoperatelog = method.getAnnotation (xxxoperatelog.class) ؛ String BusinessType = log.busstype () ؛ String BusinessDesc = log.busstypedesc () ؛ hashmap requestMap = servletutils.getParameterStoHashMap (request) ؛ // ابحث عن نوع الأعمال من المعلمات if (businessType.equals ("")) {Object objBusinessType = requestMap.get ("business_type") ؛ BusinessType = objbusinesstype == null؟ "": objbusinesstype.toString () ؛ } // وجدت نوع العمل من نموذج الطلب الخاص بكائن نتيجة التنفيذ تطبيق = request.getAttribute ("تطبيق") ؛ if (تطبيق! = null) {jsonobject obj = jsonfactory.tojsonabstractentity (تطبيق) ؛ if (obj! = null) {valuereturn.setotherDesc ("تطبيق الرقم:"+obj.getString ("applic_no")) ؛ if (businessType.equals ("")) {businessType = obj.getString ("Business_type") ؛ }}} // العثور على نوع العمل من معلمات عملية التنفيذ للطريقة (عادةً ما يتم تعيينه يدويًا) إذا كان (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.setOperateResult (xxxsysconstant.yesorno.yes) ؛ valuereturn.setOperateType (log.operateType ()) ؛ Valuereturn.setInputuserId (((UserContext) WebUtils.getSessionAttribute (طلب ، "xxxusercontext")). getSySuser (). getId ()) ؛ valuereturn.setOperateTypedesc (log.operateTypedesc ()) ؛ valuereturn.setRequestip (getRemoteHost (request)) ؛ valuereturn.setRequesturl (request.getRequesturi ()) ؛ valuereturn.setserverip (request.getlocaladdr ()) ؛ valuereturn.setuids (tag.get ()) ؛ // احفظ تشغيل SystemLogService.SavesystemLog (Valuereturn) ؛ } آخر {logger.info ("لا تسجل معلومات السجل") ؛ } // حفظ نتيجة العملية} catch (استثناء e) {E.PrintStackTrace () ؛ } إرجاع العودة ؛ } // سجل استثناء log apterthrowing (pointCut = "log ()" ، rehrowing = "e") public void doAfterThrowing (JoinPoint JoinPoint ، throwable e) {try {info (JoinPoint) ؛ Object [] orgs = joinpoint.getargs () ؛ SystemLog Valuereturn = null ؛ لـ (int i = 0 ؛ i <orgs.length ؛ i ++) {if (orgs [i] eastyof systemlog) {valuereturn = (systemlog) orgs [i] ؛ }} if (valuereturn == null) {valuereturn = new SystemLog () ؛ } if (valuereturn! = null && request! = null) {methodsignature ms = (methodsIgnature) joinpoint.getSignature () ؛ طريقة طريقة = ms.getMethod () ؛ xxxoperatelog log = method.getAnnotation (xxxoperatelog.class) ؛ String BusinessType = log.busstype () ؛ String BusinessDesc = log.busstypedesc () ؛ if (businessType.equals ("")) {Object objbusinesstype = servletutils.getParameterStoShmap (request) .get ("business_type") ؛ BusinessType = objbusinesstype == null؟ "": objbusinesstype.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 (طلب ، "xxxusercontext")). getSySuser (). getId ()) ؛ valuereturn.setOperateResult (xxxsysconstant.yesorno.no) ؛ سلسلة errmes = e.getMessage () ؛ if (errmes! = null && errmes.length ()> 800) {errmes = errmes.substring (0 ، 800) ؛ } valuereturn.seterRormessage (errmes) ؛ valuereturn.setRequestip (getRemoteHost (request)) ؛ valuereturn.setRequesturl (request.getRequesturi ()) ؛ valuereturn.setserverip (request.getlocaladdr ()) ؛ valuereturn.setuids (tag.get ()) ؛ SystemLogService.SavesystemLog (Valuereturn) ؛ } آخر {logger.info ("لا يتم تسجيل معلومات السجل") ؛ }} catch (استثناء e1) {e1.printStackTrace () ؛ }} معلومات باطلة خاصة (JoinPoint JoinPoint) { logger.debug("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Object[] OS = JoinPoint.getargs () ؛ logger.debug ("sourcelocation:/t" + JoinPoint.getSourcelOction ()) ؛ logger.debug ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- request.getheader ("proxy-client-ip") ؛ "غير معروف" .equalsignorecase (IP)) {ip = request.getRemoteaddr () ؛قم بتعديل ملف التكوين spring-mvc.xml وأضف التكوين التالي
<!-قم بتشغيل اعتراض AOP-> <aOP: Sidej-Autoproxy proxy-t-arget-class = "true" /> <mvc: revarive-diven /> <!-حدد نطاق الربيع الوصف بين-> <السياق: مكون-سكان قاعدة الحزم = "**. common.log" Expression = "org.springframework.stereotype.controller"/> </context: Component-Scan>
تجدر الإشارة إلى أنه يجب وضع التكوين أعلاه في نفس ملف XML ، إما spring-mvc.xml أو spring-context.xml ، وإلا فقد لا يكون له ساري المفعول ، ولم يتم العثور على السبب بعد.
استخدام التعليقات التوضيحية
@xxxoperatelog (busStype = xxxsysConstant.business_type.yyyyy ، busStypedesc = "description type business type" ، operateType = xxxsysconstant.logoperateType.query ، operateTypedesc = "description description") @requestmapp = requestmethod.post) public void queryxxxx4datagrid (طلب httpservletrequest ، httpservletresponse arg1 ، نموذج ، كاتب الكاتب) { 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 ، نموذج ، الكاتب) logger.info ("=================================================================================================================================================================== logger.info ("====================== httpservletresponse arg1 ، نموذج نموذج ،التعليقات التوضيحية المخصصة لـ SpringMVC أعلاه ، فإن طريقة استخدام AOP لإدراك أن التسجيل هي كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.