การใช้งานพร็อกซีแบบไดนามิก
โหมดที่ใช้: โหมดพร็อกซี
ฟังก์ชั่นของโหมดพร็อกซีคือการจัดหาพร็อกซีสำหรับวัตถุอื่น ๆ เพื่อควบคุมการเข้าถึงวัตถุนี้ คล้ายกับหน่วยงานเช่า
พร็อกซีแบบไดนามิกสองตัว:
(1) พร็อกซีไดนามิก JDK JDK Dynamic Proxy ถูกนำมาใช้โดยกลไกการสะท้อนกลับภายใน Java คลาสเป้าหมายจะขึ้นอยู่กับอินเทอร์เฟซแบบครบวงจร (InvocationHandler)
(2) พร็อกซีแบบไดนามิก CGLIB และชั้นพื้นฐานของพร็อกซีแบบไดนามิก CGLIB ถูกนำมาใช้ด้วยความช่วยเหลือของ ASM พร็อกซีแบบไดนามิกที่ดำเนินการโดยห้องสมุดบุคคลที่สามเช่น CGLIB นั้นมีการใช้กันอย่างแพร่หลายมากขึ้นและมีข้อได้เปรียบมากขึ้นในด้านประสิทธิภาพ
กรอบแอปพลิเคชันหลัก:
AOP ในฤดูใบไม้ผลิ interceptor ใน struts2
การใช้งานเฉพาะ:
1. กำหนดอินเทอร์เฟซและใช้คลาส
แพ็คเกจ com.example.service; อินเตอร์เฟสสาธารณะ userservice {สตริงสาธารณะ getName (int id); Getage จำนวนเต็มสาธารณะ (int id);} แพ็คเกจ com.example.service.impl; นำเข้า com.example.service.userService; ผู้ใช้ระดับสาธารณะผู้ใช้งานการใช้งานผู้ใช้ {สตริงสาธารณะ getName (ID int) {System.out.println ("------ getName -----"); กลับ "แมว"; } Public Integer Getage (int id) {system.out.println ("------ getage -----"); กลับ 10; -2. การใช้งานพร็อกซีแบบไดนามิก JDK
แพ็คเกจ com.example.jdk; นำเข้า java.lang.reflect.invocationhandler; นำเข้า java.lang.reflect.method; นำเข้า java.lang.reflect.proxy; คลาสสาธารณะ myinvocationhandler ดำเนินการ requocationhandler {เป้าหมายวัตถุส่วนตัว; / ** * ผูกวัตถุตัวแทนและส่งคืนคลาสพร็อกซี * * @param เป้าหมาย * @return */ การผูกวัตถุสาธารณะ (เป้าหมายวัตถุ) {this.target = target; // รับพร็อกซีวัตถุส่งคืน proxy.newproxyinstance (target.getClass (). getClassLoader (), target.getClass (). getInterfaces (), นี่); // ในการผูกอินเทอร์เฟซ (นี่คือข้อบกพร่อง cglib ทำขึ้นสำหรับข้อบกพร่องนี้)} @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีการวิธีการวัตถุ [] args) โยนได้ {ถ้า ("getName" .Equals (method.getName ())) Object result = method.invoke (เป้าหมาย, args); System.out.println ("------ หลังจาก" + method.getName () + "------"); ผลการกลับมา; } else {object result = method.invoke (เป้าหมาย, args); ผลการกลับมา; - แพ็คเกจ com.example.jdk; นำเข้า com.example.service.userservice; นำเข้า com.example.service.impl.userserviceimpl;/*** คลาสทดสอบ*/คลาสสาธารณะ runjdk {โมฆะคงที่สาธารณะ ผู้ใช้ userservice userserviceproxy = (userservice) proxy.bind (ใหม่ userserviceimpl ()); System.out.println (UserserViceProxy.getName (1)); System.out.println (userserviceproxy.getage (1)); -ผลการทำงาน:
------ ก่อน getName ----
------ getName -----
------ หลังจาก getName -----
แมว
----- getage -----
10
3. การใช้งานพร็อกซีแบบไดนามิกแบบไดนามิก:
กลไกพร็อกซีแบบไดนามิกของ JDK สามารถพร็อกซีคลาสที่ใช้อินเทอร์เฟซเท่านั้น แต่คลาสที่ไม่สามารถใช้อินเทอร์เฟซไม่สามารถใช้พร็อกซีแบบไดนามิกของ JDK ได้ CGLIB ใช้พร็อกซีสำหรับชั้นเรียน หลักการของมันคือการสร้างคลาสย่อยสำหรับคลาสเป้าหมายที่ระบุและเขียนทับการปรับปรุงการใช้งานวิธีการ อย่างไรก็ตามเนื่องจากการสืบทอดถูกใช้คลาสที่แก้ไขโดยสุดท้ายจึงไม่สามารถพร็อกซีได้
คลาสหลักของ CGLIB:
net.sf.cglib.proxy.enhancer คลาสการเพิ่มประสิทธิภาพหลัก
net.sf.cglib.proxy.methodinterceptor วิธีการหลักสกัดกั้นคลาสซึ่งเป็น interface ย่อยของอินเตอร์เฟสการโทรกลับและต้องการการใช้งานผู้ใช้
net.sf.cglib.proxy.methodproxy คลาสพร็อกซีของ Java.lang.reflect.method คลาสของ JDK สามารถใช้การโทรไปยังวิธีการวัตถุแหล่งที่มาได้อย่างง่ายดาย
อินเตอร์เฟส net.sf.cglib.proxy.methodinterceptor เป็นประเภทการโทรกลับทั่วไปมากที่สุดและมักจะใช้โดย AOP ที่ใช้พร็อกซีเพื่อใช้การเรียกวิธีการสกัดกั้น อินเทอร์เฟซนี้กำหนดวิธีเดียวเท่านั้น
การสกัดกั้นวัตถุสาธารณะ (วัตถุวัตถุ, java.lang.reflect.meth
Object [] args, methodproxy proxy) โยนได้
พารามิเตอร์แรกคือวัตถุพร็อกซีและพารามิเตอร์ที่สองและสามเป็นวิธีการสกัดกั้นและพารามิเตอร์ของวิธีการตามลำดับ วิธีดั้งเดิมอาจถูกเรียกโดยใช้การเรียกสะท้อนทั่วไปโดยใช้วัตถุ java.lang.reflect.method หรือโดยใช้ net.sf.cglib.proxy.methodproxy วัตถุ net.sf.cglib.proxy.methodproxy มักจะต้องการเพราะเร็วกว่า
แพ็คเกจ com.example.cglib; นำเข้า org.springframework.cglib.proxy.enhancer; นำเข้า org.springframework.cglib.proxy.methodinterceptor; นำเข้า org.springframework.cglib.proxy.methodproxy; MethodInterceptor {เป้าหมายวัตถุส่วนตัว; / ** * สร้างวัตถุพร็อกซี * * @param เป้าหมาย * @return */ วัตถุสาธารณะ getInstance (เป้าหมายวัตถุ) {this.target = target; Enhancer Enhancer = New Enhancer (); enhancer.setsuperclass (this.target.getClass ()); // วิธีการโทรกลับ Method.setCallback (นี่); // สร้างพร็อกซีออบเจ็กต์ return enhancer.create (); } @Override การสกัดกั้นวัตถุสาธารณะ (Object O, วิธีการ, วัตถุ [] วัตถุ, methodproxy methodproxy) พ่น {system.out.println ("++++++++ ก่อน"+methodProxy.getSuperName ()+"++++++++ System.out.println (method.getName ()); ผลลัพธ์ของวัตถุ = methodProxy.invokesuper (o, วัตถุ); System.out.println ("++++++ หลังจาก"+MethodProxy.getSuperName ()+"++++++++++"); ผลการกลับมา; - แพ็คเกจ com.example.cglib; นำเข้า com.example.service.userservice; นำเข้า com.example.service.impl.userserviceimpl;/** * ทดสอบ cglib */คลาสสาธารณะ runcglib {public static void main UserserVice UserserVice = (Userservice) CGLIBPROXY.GETINSTANCE (ใหม่ userserViceImpl ()); userservice.getName (1); userservice.getage (1); -ผลการทำงาน:
++++++ ก่อน cglib $ getName $ 0 +++++++++
getName
------ getName -----
++++++ หลังจาก cglib $ getName $ 0 +++++++++
++++++ ก่อน cglib $ getage $ 1 ++++++++
การรับ
----- getage -----
++++++ หลังจาก cglib $ getage $ 1 +++++++++
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะช่วยในการศึกษาหรือทำงานของทุกคน ฉันหวังว่าจะสนับสนุน Wulin.com เพิ่มเติม!