บทความนี้แนะนำวิธีการใช้ AOP ในโครงการ Springboot ฉันจะแบ่งปันกับคุณ รายละเอียดมีดังนี้:
1. ภาพรวม
การใช้ตรรกะทั่วไปเพื่อใช้เทคโนโลยี AOP สามารถทำให้การเขียนโปรแกรมง่ายขึ้นอย่างมากเช่นการตรวจสอบลายเซ็นการรับรองความถูกต้อง ฯลฯ ธุรกรรมการประกาศของฤดูใบไม้ผลิจะถูกนำไปใช้ผ่านเทคโนโลยี AOP
สำหรับรหัสเฉพาะโปรดดูตัวอย่างโครงการ https://github.com/qihaiyan/springcamp/tree/master/spring-aop
เทคโนโลยี AOP ของฤดูใบไม้ผลิมีแนวคิดหลักสี่ประการ:
PointCut: จุดตัดใช้เพื่อกำหนดวิธีการที่จะถูกดักจับตัวอย่างเช่นการดำเนินการ (*cn.springcamp.springaop.service.*.*(.. ))
คำแนะนำ: การดำเนินการที่จะดำเนินการหลังจากสกัดกั้นวิธีการ
แง่มุม: ชิ้นรวม pointcut และคำแนะนำเข้าด้วยกันเพื่อสร้างพื้นผิวที่ถูกตัด
จุดร่วม: อินสแตนซ์ของ pointcut ระหว่างการดำเนินการ
Weaver: กรอบการทำงานสำหรับการใช้ AOP เช่น AspectJ หรือ Spring AOP
2. คำจำกัดความจุดนิยาม
คำจำกัดความ PointCut ที่ใช้กันทั่วไปรวมถึงการดำเนินการและ @Annotation การดำเนินการกำหนดวิธีฟรีและใช้ในการใช้ส่วนที่ค่อนข้างธรรมดา @Annotation สามารถเพิ่มเป็นคำอธิบายประกอบกับวิธีการเฉพาะเช่นคำอธิบายประกอบการทำธุรกรรมของสปริง
คำจำกัดความการดำเนินการของการดำเนินการควรอยู่ในระดับสาธารณะเพื่อจัดการคำจำกัดความของจุดศูนย์กลาง
ตัวอย่าง:
คลาสสาธารณะ CommonJoinPointConfig {@PointCut ("Execution (*CN.SPRINGCAMP.SPRINGAOP.SERVICE.*.*.*(.. ))") โมฆะสาธารณะ ServiceLayerExecution () {}}}ด้วยวิธีนี้ในคลาสที่เฉพาะเจาะจงคุณสามารถอ้างถึงจุดแทนเจนต์ผ่าน CommonjoinpointConfig.servicelayerexecution ()
คลาสสาธารณะ BEOREASPECT {@Before ("CommonJoinPointConfig.servicelayerexecution ()") โมฆะสาธารณะก่อน (JoinPoint JoinPoint) {System.out.println ("---------------> ก่อน"); System.out.println ("-----------------> ก่อนที่จะดำเนินการ" + JoinPoint); -เมื่อต้องเปลี่ยนจุดแทนเจนต์คุณจะต้องปรับเปลี่ยนคลาส CommonJoinPointConfig โดยไม่ต้องแก้ไขแต่ละคลาส
3. การตัดใบหน้าที่ใช้กันทั่วไป
ก่อน: ดำเนินการคำแนะนำก่อนที่จะดำเนินการวิธีการซึ่งมักจะใช้สำหรับการตรวจสอบลายเซ็นการตรวจสอบ ฯลฯ
หลังจาก: ดำเนินการหลังจากการดำเนินการวิธีการเสร็จสิ้นไม่ว่าการดำเนินการจะสำเร็จหรือมีการโยนข้อยกเว้น
Afterreturning: ดำเนินการหลังจากการดำเนินการวิธีการสำเร็จเท่านั้น
Afterthrowing: ดำเนินการเฉพาะหลังจากการดำเนินการวิธีการจะมีข้อยกเว้น
สิ่งที่เรียบง่าย:
@ASPACT @ComponentPublic Class BEOREASPECT {@Before ("CommonJoinPointConfig.servicelayerExecution ()") โมฆะสาธารณะก่อน (JoinPoint JoinPoint) {System.out.println ("---------------> ก่อน"); System.out.println ("----------------> ก่อนการดำเนินการของ" + joinpoint); -4. คำอธิบายประกอบแบบกำหนดเอง
สมมติว่าเราต้องการรวบรวมเวลาดำเนินการของวิธีการเฉพาะวิธีที่สมเหตุสมผลมากขึ้นคือการปรับแต่งคำอธิบายประกอบจากนั้นเพิ่มคำอธิบายประกอบนี้ในวิธีการที่ต้องรวบรวมเวลาดำเนินการ
ก่อนกำหนด tracktime คำอธิบายประกอบ:
@Target ({ElementType.Method, ElementType.type}) @retention (retentionPolicy.runtime) สาธารณะ @Interface tracktime {String param () ค่าเริ่มต้น "";}จากนั้นกำหนดคลาสต่างๆเพื่อใช้พฤติกรรมของคำอธิบายประกอบ:
@ASPACT@ComponentPublic Class TrackTimeAspect {@Around ("@Annotation (tracktime)") วัตถุสาธารณะรอบ ๆ (ดำเนินการ joinpoint pointpoint, tracktime tracktime) โยน {object result = null; Long StartTime = System.currentTimeMillis (); result = joinpoint.proceed (); timetaken ยาว = system.currenttimeMillis () - เริ่มต้น; System.out.println ("--------------> เวลาที่ใช้โดย" + JoinPoint + "พร้อม param [" + tracktime.param () + "] คือ" + timetaken); ผลการกลับมา; -โดยการใช้คำอธิบายประกอบนี้ในวิธีการคุณสามารถรวบรวมเวลาดำเนินการของวิธีนี้:
@tracktime (param = "myService") สตริงสาธารณะ runfoo () {system.out.println ("----------------> foo"); กลับ "foo";}โปรดทราบว่า @tracktime (param = "myservice") สามารถผ่านคำอธิบายประกอบได้
เพื่อให้คำอธิบายประกอบผ่านพารามิเตอร์คุณต้องระบุพารามิเตอร์พารามิเตอร์พารามิเตอร์ () ค่าเริ่มต้น "เริ่มต้น" เมื่อกำหนดคำอธิบายประกอบ
ในเวลาเดียวกันในคลาสต่างๆจะมีการเพิ่มพารามิเตอร์ที่เกี่ยวข้องในวิธีการรอบ ๆ ชื่อตัวแปรของพารามิเตอร์จะต้องเป็น tracktime ใน @around annotation แต่ไม่ใช่ชื่อคลาสของคลาส
@Around ("@Annotation (tracktime)") วัตถุสาธารณะรอบ ๆ (ดำเนินการ jointingpoint pointpoint, tracktime tracktime)5. สรุป
เมื่อเรียกใช้โครงการตัวอย่างคอนโซลจะส่งออกดังต่อไปนี้:
----------------> ก่อนแง่มุม
--------------> ก่อนการดำเนินการของการดำเนินการ (String cn.springcamp.springaop.service.myservice.runfoo ())
---------------> foo
---------------> เวลาที่ดำเนินการโดยการดำเนินการ (String cn.springcamp.springaop.service.myservice.runfoo ()) กับ param [myservice] คือ 8
---------------> หลังจากนั้น
--------------> หลังจากดำเนินการตามการดำเนินการ (String Cn.SpringCamp.springaop.service.myservice.runfoo ())
---------------> ด้านการคืนค่า
----------------> Execution (String Cn.SpringCamp.springaop.service.myservice.runfoo ()) ส่งคืนด้วยค่า foo
จะเห็นได้ว่าคำสั่งการดำเนินการของหลาย ๆ ด้านก่อนหน้านี้หลังจากการส่งคืน (หลังการเต้น)
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น