1. คำนำ
ฉันจะไม่แนะนำ Spring AOP ฉันค้นหาออนไลน์มาก ทุกคนที่ใช้ IOC และ AOP ของฤดูใบไม้ผลิรู้ เรามักจะใช้ IOC แต่ในระบบของเราเองการใช้ AOP เกือบจะเป็นศูนย์ ยกเว้นฟังก์ชั่นการตรวจสอบขนาดเล็กที่ใช้งานอื่น ๆ จะไม่ถูกใช้โดยทั่วไป ด้านล่างตัวแก้ไขจะจัดเรียงโซลูชันเพื่อใช้วิธีการบันทึก Spring AOP เพื่อดำเนินการตามเวลา ลองมาดูกันว่าคุณต้องการ
2. โซลูชัน
1. วิธีการดั้งเดิม
วิธีที่ง่ายและหยาบที่สุดคือการเพิ่มการประทับเวลาที่จุดเริ่มต้นและจุดสิ้นสุดของแต่ละวิธีที่ต้องการสถิติจากนั้นคำนวณความแตกต่าง รหัสมีดังนี้:
Long StartTime = System.currentTimeMillis (); // รหัสธุรกิจ endtime long = system.currentTimeMillis (); System.out.println ("เวลาทำงานของโปรแกรม:" + (endtime - starttime) + "ms"); // โปรแกรมเอาท์พุทเวลาทำงานวิธีนี้ต้องใช้รหัสใช้เวลานานในการเพิ่มวิธีการทางสถิติหลายอย่าง รหัสเหล่านี้ไม่มีส่วนเกี่ยวข้องกับธุรกิจหลัก แต่มีการทำซ้ำในปริมาณมากและกระจัดกระจายไปทุกที่ทำให้ยากต่อการรักษา
2. วิธีการเขียนโปรแกรมแบบแทนเจนต์
ดังนั้นจึงไม่แนะนำให้ใช้รหัสรสชาติที่ไม่ดีข้างต้น ฉันคิดถึงมันเป็นเวลานานและวางแผนที่จะใช้แนวคิดของ Spring AOP เพื่อทำหน้าที่นี้ให้เสร็จสมบูรณ์ หากไม่มีความกังวลใจเพิ่มเติมรหัสและคำอธิบายที่เกี่ยวข้องมีดังนี้:
นำเข้า org.apache.commons.logging.log; นำเข้า org.apache.commons.logging.logfactory; นำเข้า org.aspectj.lang.proceedingjoinpoint; นำเข้า org.aspectj.lang.annotation.around; นำเข้า org.aspectj.lang.annotation.aspect; นำเข้า org.aspectj.lang.reflect.methodsignature; นำเข้า org.springframework.stereotype.Component;/*** คลาส Spring Facet ที่ใช้เวลานานสำหรับการดำเนินการตรวจจับ* การใช้คลาสที่มีคำอธิบายประกอบโดย @Aspect สปริงจะถือว่าเป็นถั่วพิเศษ (ส่วน) {logger log private static = logfactory.getLog (TimeNinterceptor.class); // หนึ่งนาทีนั่นคือ 1,000ms ส่วนตัวคงที่สุดท้ายยาว one_minute = 1,000; // ส่วนที่ใช้เวลานานทางสถิติของเลเยอร์บริการจะต้องเป็นที่สิ้นสุดสำหรับประเภทสตริงตัวแปรที่จะใช้ในคำอธิบายประกอบสามารถเป็นค่าคงที่คงที่ public public point จุดสุดท้ายจุดสุดท้าย = "การดำเนินการ (*com.blinkfox.test.service.impl.*.*(.. )"; / ** * การดำเนินการใช้เวลานานของวิธีการทางสถิติรอบ ๆ การแจ้งเตือนโดยรอบ * @param joinpoint * @return */ @around (จุด) Timearound วัตถุสาธารณะ (ดำเนินการ Joinpoint Joinpoint) {// กำหนดพารามิเตอร์ที่จำเป็นในการส่งคืนวัตถุและรับวิธี วัตถุ obj = null; Object [] args = joinpoint.getargs (); Long StartTime = System.currentTimeMillis (); ลอง {obj = joinpoint.proceed (args); } catch (throwable e) {logger.error ("ข้อผิดพลาดทางสถิติในการดำเนินการตามเวลาที่ใช้เวลาในการดำเนินการแจ้งเตือน", e); } // รับเมธอดการดำเนินการชื่อ Long Endtime = System.currentTimeMillis (); MethodSignature Signature = (MethodSignature) JoinPoint.getSignature (); String MethodName = Signature.getDeclaringTyPename () + " + signature.getName (); // พิมพ์ข้อมูลที่ใช้เวลานานนี้ printexectime (ชื่อวิธีการเริ่มต้นเวลา endtime); คืน OBJ; } /*** พิมพ์ข้อมูลที่ใช้เวลานานซึ่งพิมพ์วิธีการดำเนินการ หากเกินเวลาที่กำหนดให้พิมพ์ * @param methodname * @param starttime * @param endtime */ private void printexectime (String methodName, Long StartTime, Long Endtime) {Long Difftime = EndTime - StartTime; if (difftime> one_minute) {logger.warn ("-----" + methodName + "วิธีการดำเนินการ:" + difftime + "ms"); - หมายเหตุ: ในที่สุดคุณต้องเพิ่มการกำหนดค่าที่ AOP ต้องการในไฟล์ applicationContext.xml <aop:aspectj-autoproxy/> เพื่อให้สปริงสามารถรับรู้ได้
สรุป
ข้างต้นคือทั้งหมดที่เกี่ยวกับการใช้ Spring AOP เพื่อบันทึกเวลาดำเนินการ ฉันหวังว่าเนื้อหาของบทความนี้จะช่วยในการศึกษาหรือทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com