AOP ฉันคิดว่าทุกคนชัดเจนมาก บางครั้งเราจำเป็นต้องประมวลผลบันทึกการร้องขอบางอย่างหรือตรวจสอบวิธีการบางอย่างและควรจัดการอะไรถ้ามีข้อยกเว้น? ตอนนี้เราแนะนำ AOP จาก Spring-Boot
[สภาพแวดล้อมการพัฒนา: หมายเลขเวอร์ชัน JDK คือ 1.8, ฤดูใบไม้ผลิ
หมายเลขรุ่นของการบูตคือ 1.4.1] {style =” พื้นหลังสี:#ff0000”}
ก่อนอื่นเราจะแนะนำแพ็คเกจ JAR ก่อน
ไฟล์ POM ถูกเพิ่มดังนี้:
<!-อ้างอิง AOP-> <การพึ่งพา> <roupId> org.springframework.boot </groupId> <ratifactid> Spring-Boot-Starter-Aop </artifactid> </dercendency> <!-Cite GSON สำหรับการพิมพ์-> <Sersion> 2.7 </Servent> </dermentency>
หลังจากแนะนำแพ็คเกจ JAR เราเพิ่มวิธีการประมวลผลคำของ่ายๆสองวิธีในการเริ่มต้นการเริ่มต้น:
@springbootapplication (scanbasepackages = {"com"})@restcontrollerpublic คลาสการสาธิตคลาส {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (demoapplication.class, args); } // ทดสอบคำขอรับโดยไม่มีอาร์กิวเมนต์ @RequestMapping (value = "/testAspect", method = requestMethod.get) การทดสอบ USERVO สาธารณะ () {uservo uservo = ใหม่ uservo (); uservo.setage ("23"); uservo.setName ("เขา xiaowu"); uservo.setsex ("ชาย"); คืน Uservo; } // ทดสอบคำขอรับด้วยพารามิเตอร์ให้ AOP พิมพ์เนื้อหาพารามิเตอร์ @RequestMapping (value = "/testAspectArgs", method = requestMethod.get) การทดสอบ USERVO สาธารณะ (ชื่อสตริงอายุสตริง uservo.setName (ชื่อ); uservo.setage (อายุ); uservo.setsex (เพศ); คืน Uservo; -หลังจากเพิ่มวิธีการประมวลผลคำของ่าย ๆ สองวิธีแล้วเพิ่ม AOP ของเรา
/** * ชื่อโครงการ: SpringbootDemo * ผู้สร้าง: เขา Xiaowu * เวลาการสร้าง: 16/12/4 7:05 PM * ชื่อคลาส: APPECTDEMO * คลาสคำอธิบาย: * /// DECLARE เป็นส่วน@ASPACE // DECLARE เป็น Spring Managed Bean@Component@order ส่วนตัว GSON GSON = New GSON (); // ประกาศจุดหนึ่งในนิพจน์การดำเนินการ @PointCut ("การดำเนินการ (สาธารณะ * com.example.demoapplication. * (.. ))") โมฆะส่วนตัวคอนโทรลเลอร์สปิรต () {} // พิมพ์เนื้อหาก่อนที่จะขอวิธี @before (value = "ControllerAspect ()") (servletrequestattributes) requestcontextholder.getrequestattributes (); httpservletRequest request = requestattributes.getRequest (); // พิมพ์เนื้อหาคำขอ log.info ("========================================================== - - - - - - - // พิมพ์เนื้อหาที่ส่งคืนหลังจากวิธีการถูกดำเนินการ @afterReturning (returning = "o", pointcut = "controllerAspect ()") โมฆะสาธารณะ methodafterreturning (Object O) { log.info ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -หลังจากกำหนดค่าทั้งสองแล้วเราขอจากนั้นดูบันทึกการพิมพ์ ก่อนอื่นให้เริ่มคอนเทนเนอร์ของเราจากนั้นเราขอวิธีการประมวลผลพารามิเตอร์ก่อน บันทึกการพิมพ์มีดังนี้:
{width =” 1232”
ความสูง =” 132”}
จะพบได้ว่า URL, เมธอด, ค่าพารามิเตอร์ ARGS, ประเภทและเนื้อหาที่ส่งคืนนั้นถูกพิมพ์ออกมาทั้งหมดแสดงให้เห็นว่านี่คือการสกัดกั้น AOP ได้สำเร็จ
ต่อไปเราทดสอบวิธีการประมวลผลคำขอโดยไม่มีพารามิเตอร์และพิมพ์บันทึกดังนี้:
{width =” 1100”
ความสูง =” 130”}
เราสามารถพบได้ว่าพารามิเตอร์วิธีการที่พิมพ์ในวิธีนี้เป็นอาร์เรย์ที่ว่างเปล่าเนื่องจากวิธีการไม่จำเป็นต้องผ่านพารามิเตอร์
ข้างต้นคือ Springboot อ้างอิง AOP สำหรับการประมวลผลบันทึกการประมวลผลเว็บ นี่คือคำอธิบายประกอบหลักสำหรับส่วน AOP ต่อไปนี้เป็นเพียงคำอธิบายและการใช้คำอธิบายประกอบ ผู้เขียนจะไม่ทดสอบรายละเอียด หากคุณสนใจคุณสามารถทดสอบด้วยตัวเอง:
คำอธิบายประกอบชั้นเรียน:
@Aspect กำหนดคลาสเป็นคลาสต่างๆ
@order (i) ทำเครื่องหมายลำดับความสำคัญของการประมวลผลของคลาส FaceT ค่า I ที่เล็กลงเท่าไหร่ระดับลำดับความสำคัญก็จะยิ่งสูงขึ้นเท่านั้น PS: คุณสามารถใส่คำอธิบายประกอบชั้นเรียนหรือใส่คำอธิบายประกอบได้
คำอธิบายประกอบวิธี:
@PointCut กำหนดวิธีการเป็นจุดตัดเป็นนิพจน์รายละเอียดต่อไปนี้
@Before ดำเนินการวิธีการก่อนจุดแทนเจนต์เนื้อหาคือจุดแทนเจนต์ที่ระบุ
@After ดำเนินการหลังจากตัดจุดก่อนกลับ
@afterreturning ดำเนินการหลังจากจุดเข้าและกลับ หากคุณต้องการประมวลผลพารามิเตอร์การส่งคืนของบางวิธีคุณสามารถใช้งานได้ที่นี่
@Around ล้อมรอบจุดแทนเจนต์ดำเนินการก่อนเข้าสู่จุดแทนเจนต์และหลังจุดแทนเจนต์
@afterthrowing โยนข้อยกเว้นหลังจากจุดร่องสำหรับการประมวลผล
@order (i) ทำเครื่องหมายลำดับความสำคัญของการตัดจุด ยิ่งฉันน้อยเท่าไหร่ก็ยิ่งมีลำดับความสำคัญสูงเท่านั้น
@PointCut คำอธิบายประกอบ:
ในรหัสข้างต้นเรากำหนดจุดแทนเจนต์ที่ประมวลผลเส้นทางที่ระบุเท่านั้น:
@PointCut ("Execution (สาธารณะ * com.example.DemoApplication. * (.. ))") โมฆะส่วนตัวคอนโทรลเลอร์สปริป () {}ตอนนี้เรากำลังกำหนดจุดแทนเจนต์เพื่อจัดการเส้นทางอื่น ๆ :
@PointCut ("Execution (สาธารณะ*com.demo.*.*(.. ))") โมฆะส่วนตัว ControllerDemo () {}จุดแทนเจนต์ข้างต้นจะถูกประมวลผลแยกต่างหาก หากเราต้องการจุดแทนเจนต์ในการประมวลผลทั้งสองอย่างเราสามารถกำหนดค่าได้เช่นนี้:
@PointCut (value = "controllerAspect () || controllerDemo ()") โมฆะส่วนตัวทั้งหมด () {} ในคำอธิบายประกอบ @pointcut อ้างอิงโดยตรงไปยังชื่อวิธีอื่น ๆ ที่มีคำอธิบายประกอบโดย @pointcut เพื่อให้จุดตัดสามารถจัดการวิธีการภายใต้สองพา ธ
@pointcut คำอธิบายประกอบการดำเนินการนิพจน์: สาธารณะ*com.demo.*.*(.. )
ตัวดัดแปลงสาธารณะครั้งแรกที่เป็นตัวแทนสามารถใช้ * แทน * แรก * เพื่อแสดงค่าส่งคืนและ * แสดงทั้งหมด
com.demo.* เส้นทางแพ็คเกจ,.* หมายถึงแพ็คเกจที่สามในเส้นทาง* แสดงถึงวิธีการของคลาสทั้งหมดภายใต้แพ็คเกจทั้งหมดภายใต้เส้นทาง
(.. ) หมายถึงพารามิเตอร์วิธีการไม่ จำกัด
บันทึกบางอย่างเกี่ยวกับ @Order (i) คำอธิบายประกอบ:
คลาสคำอธิบายประกอบค่าที่เล็กลงยิ่งมีลำดับความสำคัญมากขึ้นวิธีการเพิ่มความคิดเห็นคำอธิบายประกอบทั้งสองจะมีคำอธิบายประกอบ: @Before ยิ่งค่า I ที่เล็กลงเท่าไหร่ลำดับความสำคัญก็ยิ่งมีลำดับความสำคัญมากเท่าไหร่ก็ยิ่งมีความสำคัญมากขึ้นเท่านั้น
เพื่อสรุปทั้งสองมันคือ:
ในการดำเนินการก่อนจุดเริ่มต้นการดำเนินการหลังจากจุดเริ่มต้นจะดำเนินการโดยค่าคำสั่งซื้อจากขนาดเล็กถึงขนาดใหญ่และการดำเนินการหลังจากจุดเริ่มต้นจะดำเนินการโดยค่าคำสั่งซื้อจากขนาดใหญ่ถึงขนาดเล็กถึงขนาดเล็ก
ขยาย:
ผู้อ่านบางคนอาจถามว่าหากฉันต้องการพิมพ์เวลาที่จำเป็นสำหรับการร้องขอจากการเข้าและสิ้นสุดให้กำหนดตัวแปรสมาชิกเพื่อนับเวลาและให้ @Before และ @afterreturning การเข้าถึงอาจมีปัญหาการซิงโครไนซ์ ดังนั้นเราจึงอ้างถึงวัตถุ ThreadLocal ที่ระบุประเภททั่วไป เวลาในการบันทึกคำขอใน @Before และหักบันทึกใน @AfterReturning คือเวลาที่ใช้ รหัสมีดังนี้:
/** * ชื่อโครงการ: SpringbootDemo * ผู้สร้าง: เขา Xiaowu * เวลาการสร้าง: 16/12/4 7:05 PM * ชื่อคลาส: APPECTDEMO * คลาสคำอธิบาย: * /// การประกาศเป็นส่วน@ASPACE // การประกาศเป็นฤดูใบไม้ผลิ ส่วนตัว GSON GSON = New GSON (); ThreadLocal <lont> startTime = new ThreadLocal <long> (); // ประกาศจุดหนึ่งในนิพจน์การดำเนินการ @pointcut ("การดำเนินการ (สาธารณะ * com.example.demoapplication. * (.. ))") โมฆะส่วนตัวคอนโทรลเลอร์ () {} // พิมพ์เนื้อหาก่อนที่จะขอวิธี @before (value = "ControllerAspect ()") ServletRequestattributes requestattributes = (servletRequestattributes) requestcontextholder.getRequestattributes (); httpservletRequest request = requestattributes.getRequest (); // พิมพ์เนื้อหาคำขอ log.info ("============================================================================================================================ - - - - array.toString (joinpoint.getargs ())); log.info ("========================================================================================================================= array.toString (joinpoint.getargs ())); log.info ("เนื้อหาการตอบกลับ:" + gson.tojson (o)); log.info ("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ข้างต้นเป็นผลลัพธ์ทั้งหมดที่ได้จากการทดสอบของฉัน อาจมีความแตกต่างหรือข้อผิดพลาด โปรดแก้ไขฉัน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น