โหมดพร็อกซีใช้วัตถุพร็อกซีเพื่อดำเนินการตามคำขอของผู้ใช้ให้สมบูรณ์และบล็อกการเข้าถึงวัตถุจริงของผู้ใช้
โหมดพร็อกซีมีการใช้งานมากมายเช่นด้วยเหตุผลด้านความปลอดภัยจำเป็นต้องบล็อกไคลเอนต์จากการเข้าถึงวัตถุจริงโดยตรง หรือในการโทรระยะไกลต้องใช้วัตถุพร็อกซีเพื่อจัดการรายละเอียดทางเทคนิคในวิธีระยะไกล หรือเพื่อปรับปรุงระบบวัตถุจริงจะถูกห่อหุ้มเพื่อให้บรรลุวัตถุประสงค์ของการโหลดล่าช้า
เมื่อระบบเริ่มต้นการแยกวิธีที่ใช้ทรัพยากรมากที่สุดโดยใช้โหมดพร็อกซีสามารถเพิ่มความเร็วในการเริ่มต้นความเร็วของระบบและลดเวลารอของผู้ใช้ เมื่อผู้ใช้กำลังทำแบบสอบถามจริงคลาสพร็อกซีจะโหลดคลาสจริงเพื่อดำเนินการตามคำขอของผู้ใช้ นี่คือจุดประสงค์ของการใช้โหมดพร็อกซีเพื่อให้ได้การโหลดขี้เกียจ
1. การใช้งานพร็อกซีแบบคงที่:
อินเทอร์เฟซหัวข้อ:
IdbQuery ส่วนต่อประสานสาธารณะ {request string (); - หัวข้อจริง:
DBQuery คลาสสาธารณะใช้ idbQuery {Public DBQuery () {ลอง {thread.sleep (10,000); } catch (exception e) {e.printstacktrace (); }} คำขอสตริงสาธารณะ () {return "คำขอสตริง"; - พร็อกซีคลาส:
IdbQueryProxy ระดับสาธารณะใช้ idbQuery {ส่วนตัว dbQuery dbQuery; คำขอสตริงสาธารณะ () {ถ้า (dbQuery == null) dbQuery = new dbQuery (); return dbQuery.request (); - ในที่สุดฟังก์ชั่นหลัก:
Proxytext ระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {idbQuery dbQuery = ใหม่ idbQueryProxy (); System.out.println (dbQuery.request ()); -พร็อกซีแบบคงที่ทราบว่าคลาสพร็อกซีเป็นอินเทอร์เฟซทั่วไปสำหรับคลาสจริงที่จะนำไปใช้และคลาสพร็อกซีหมายถึงวัตถุคลาสจริงและทำให้การดำเนินงานใช้เวลานานในวิธีการคลาสพร็อกซีเพื่อนำไปใช้
พร็อกซีแบบไดนามิก:
พร็อกซีแบบไดนามิกคือเมื่อทำงานสร้างคลาสพร็อกซีแบบไดนามิก นั่นคือไบต์ของคลาสพร็อกซีถูกสร้างและโหลดเมื่อรันไทม์ เมื่อเปรียบเทียบกับตัวแทนคงที่ตัวแทนไดนามิกไม่จำเป็นต้องระมัดระวังในการห่อหุ้มคลาสการห่อหุ้มที่เหมือนกันอย่างสมบูรณ์เพื่อจุดประสงค์ที่แท้จริง หากมีอินเทอร์เฟซหัวข้อมากมายมันน่ารำคาญที่จะเขียนวิธีพร็อกซีสำหรับแต่ละอินเตอร์เฟส หากอินเทอร์เฟซเปลี่ยนแปลงทั้งคลาสจริงและคลาสพร็อกซีจะต้องมีการเปลี่ยนแปลงซึ่งไม่เอื้อต่อการบำรุงรักษาระบบ ประการที่สองวิธีการสร้างของตัวแทนไดนามิกบางตัวสามารถทำงานได้ที่รันไทม์ซึ่งเป็นตรรกะการดำเนินการระดับพร็อกซีที่ระบุไว้ซึ่งจะช่วยปรับปรุงความยืดหยุ่นของระบบอย่างมาก
อินเทอร์เฟซหัวข้อ:
IdbQuery ส่วนต่อประสานสาธารณะ {request string (); - JDK พร็อกซีคลาส:
คลาสสาธารณะ JDBDBQueryHandler ใช้งาน InvocationHandler {idBQuery idbQuery = null; @Override วัตถุสาธารณะเรียกใช้ (พร็อกซีวัตถุวิธีเมธอด, วัตถุ [] args) พ่น throwable {if (idbQuery == null) {idbQuery = new dbQuery (); } return idbQuery.request (); } public idbQuery public createjdbproxy () {idbQuery jdkproxy = (idbQuery) proxy.newproxyInstance (classloader.getSystemClassLoader (), คลาสใหม่ [] {idbQuery.class}, JDBDBQueryHandlower ();; System.out.println ("jdbdbqueryhandler.createjdbproxy ()"); ส่งคืน Jdkproxy; - ฟังก์ชั่นหลัก:
Proxytext ระดับสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {idbQuery idbQuery = jdbdbQueryHandler.createJdbproxy (); System.out.println (idbquery.request ()); -นอกจากนี้คุณยังสามารถใช้ CGLIB และ Javassist Dynamic Proxy ที่คล้ายคลึงกับพร็อกซีไดนามิก JDK แต่กระบวนการสร้างของ JDK Dynamic Class นั้นเร็วที่สุดเนื่องจากวิธีการ Difineclass () ในตัวถูกกำหนดเป็นการใช้งานดั้งเดิม ในฟังก์ชั่นการเรียกของคลาสพร็อกซีพร็อกซีแบบไดนามิกของ JDK นั้นไม่ดีเท่า CGLIB และ Javassist Dynamic Proxy ในขณะที่ Javassist Dynamic Proxy มีคุณภาพประสิทธิภาพที่เลวร้ายที่สุดและแย่กว่าการใช้งานของ JDK ในแอปพลิเคชันการพัฒนาจริงวิธีการเรียกความถี่การเรียกของคลาสพร็อกซีนั้นสูงกว่าความถี่การสร้างจริงของคลาสพร็อกซีดังนั้นวิธีการเรียกประสิทธิภาพของพร็อกซีแบบไดนามิกควรกลายเป็นจุดสนใจของประสิทธิภาพ คำสั่งพร็อกซีแบบไดนามิกของ JDK ที่คลาสพร็อกซีและหัวข้อจริงใช้อินเทอร์เฟซแบบครบวงจรและพร็อกซีแบบไดนามิกและ Javassist ไม่ได้มีข้อกำหนดดังกล่าว
ใน Java การใช้งานของพร็อกซีแบบไดนามิกเกี่ยวข้องกับการใช้ classloader การใช้ CGLIB เป็นตัวอย่างคำอธิบายสั้น ๆ ของกระบวนการโหลดของคลาสไดนามิกได้อธิบายไว้ การใช้ CGLIB เพื่อสร้างพร็อกซีแบบไดนามิกคุณต้องสร้างอินสแตนซ์ของคลาสเพิ่มประสิทธิภาพและกำหนดคลาสการโทรกลับสำหรับการจัดการธุรกิจพร็อกซี ในเมธอด enhancer.create () bytecode ของคลาสพร็อกซีจะถูกสร้างขึ้นโดยใช้เมธอด defaultGeneratorsTrategy.generate () และบันทึกในอาร์เรย์ไบต์ จากนั้นวิธีการเรียก rechortUtils.defineclass () และผ่านการสะท้อนกลับวิธีการโทร classloader.defineclass () เพื่อโหลด bytecode ลงใน classloader เพื่อให้การโหลดของคลาสเสร็จสมบูรณ์ ในที่สุดผ่านวิธีการสะท้อนกลับ NewInstance () อินสแตนซ์คลาสแบบไดนามิกจะถูกสร้างขึ้นโดยการสะท้อนกลับและอินสแตนซ์จะถูกส่งคืน อื่น ๆ แตกต่างจากรายละเอียดกระบวนการ แต่ตรรกะการสร้างเหมือนกัน
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน