มาพูดถึงโหมดพร็อกซี Java กับคุณกันเถอะ
1. พร็อกซีแบบคงที่
1.1 พร็อกซีพร็อกซีแบบคงที่และคลาสพร็อกซีจะต้องรักษาอินเทอร์เฟซทั่วไป
อินเทอร์เฟซสาธารณะ iuserdao {void save ();}1.2 พร็อกซีคลาสวัตถุเป้าหมาย
คลาสสาธารณะ UserDao ใช้ iuserdao {@Override โมฆะสาธารณะบันทึก () {System.out.println ("----- ข้อมูลได้รับการบันทึก !!! ------"); -1.3 วัตถุพร็อกซี
ระดับสาธารณะ UserDaoproxy ใช้ iUserdao {// รับและบันทึกเป้าหมายวัตถุเป้าหมาย iuserdao ส่วนตัว; Public UserDaoproxy (เป้าหมาย iuserdao) {this.target = เป้าหมาย; } @Override โมฆะสาธารณะบันทึก () {system.out.println ("เริ่มธุรกรรม ... "); target.save (); // วิธีการเรียกใช้งานวัตถุวัตถุเป้าหมาย. OUT.PRINTLN ("ส่งธุรกรรม ... "); -1.4 คลาสทดสอบ
แอพระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วัตถุเป้าหมาย iuserdao target = new UserDao (); // พร็อกซี iuserdao proxy = ใหม่ userdaoproxy (เป้าหมาย); Proxy.save (); // ดำเนินการพร็อกซีเมธอด}} 2. ตัวแทนไดนามิก
2.1 ในทำนองเดียวกันพร็อกซีแบบไดนามิกยังจำเป็นต้องทำอินเทอร์เฟซให้สมบูรณ์ (คล้ายกับด้านบน)
2.2 วัตถุเป้าหมายเหมือนกัน
2.3 มันแตกต่างกันในวัตถุพร็อกซี
ProxyFactory ระดับสาธารณะ {// รักษาเป้าหมายวัตถุส่วนตัววัตถุเป้าหมาย; proxyfactory สาธารณะ (เป้าหมายวัตถุ) {this.target = เป้าหมาย; } // สร้างวัตถุพร็อกซีวัตถุสาธารณะ getProxyInstance () {return proxy.newproxyinstance (target.getClass (). getClassLoader (), target.getClass (). getInterfaces () args args การทำธุรกรรม "); // ดำเนินการวัตถุวัตถุเป้าหมายวิธีการ returnValue = method.invoke (เป้าหมาย, args); system.out.println (" ส่งธุรกรรม "); returnValue;}}); -2.4 คลาสทดสอบ
แอพระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วัตถุเป้าหมาย iuserdao target = new UserDao (); System.out.println (Target.getClass ()); // สร้างวัตถุพร็อกซีสำหรับวัตถุเป้าหมาย iuserdao proxy = (iuserdao) proxyfactory ใหม่ (เป้าหมาย) .getProxyinstance (); System.out.println (Proxy.getClass ()); // ดำเนินการวิธีการ [วัตถุพร็อกซี] proxy.save (); - 3. CGLIB พร็อกซี
3.1CGLIB พร็อกซีไม่จำเป็นต้องทำให้อินเทอร์เฟซเสร็จสมบูรณ์ แต่จำเป็นต้องเขียนคลาสและคลาสพร็อกซีที่จะพร็อกซี พร็อกซีที่นี่เหมือนกับ 1.2 ดังนั้นจึงไม่ได้เขียนอีกต่อไป
3.2 คลาสพร็อกซีแตกต่างกัน เมื่อใช้โหมดพร็อกซี CGLIB คุณต้องอ้างถึงแพ็คเกจ Core Framework ของ Spring
ProxyFactory ProxyFactory ใช้ MethodInterceptor {// รักษาเป้าหมายวัตถุส่วนตัววัตถุเป้าหมาย proxyfactory สาธารณะ (เป้าหมายวัตถุ) {this.target = เป้าหมาย; } // สร้างวัตถุพร็อกซีสำหรับวัตถุเป้าหมายวัตถุสาธารณะ getProxyInstance () {// 1 เครื่องมือเพิ่มระดับเครื่องมือ EN = ใหม่ enhancer (); // 2. ตั้งค่าคลาสหลัก en.setsuperclass (target.getClass ()); // 3. ตั้งค่าฟังก์ชั่นการเรียกกลับ en.setCallback (นี่); // 4. สร้าง subclass (วัตถุพร็อกซี) ส่งคืน en.create (); } @Override การสกัดกั้นวัตถุสาธารณะ (Object OBJ, วิธีวิธี, วัตถุ [] args, methodproxy proxy) พ่น throwable {system.out.println ("เริ่มธุรกรรม ... "); // วิธีการเรียกใช้วัตถุวัตถุเป้าหมาย returnValue = method.invoke (เป้าหมาย, args); System.out.println ("ส่งธุรกรรม ...... "); returnValue; -3.3 คลาสทดสอบ
แอพคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {// วัตถุเป้าหมาย userdao target = new UserDao (); System.out.println (Target.getClass ()); // พร็อกซีออบเจ็กต์ผู้ใช้ proxy = (userdao) proxyfactory ใหม่ (เป้าหมาย) .getProxyInstance (); System.out.println (Proxy.getClass ()); // วิธีการเรียกใช้พร็อกซีออบเจ็กต์พร็อกซี (); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น