ประเด็นสำคัญของส่วนนี้:
พร็อกซีจาวาคงที่
JDK Dynamic Agent
1 ปัญหาที่พบในแนวคิดการออกแบบเชิงวัตถุ
ในการเขียนโปรแกรม OOP แบบดั้งเดิมวัตถุเป็นแกนและฟังก์ชั่นซอฟต์แวร์ที่สมบูรณ์จะเกิดขึ้นจากการทำงานร่วมกันระหว่างวัตถุ เนื่องจากวัตถุสามารถสืบทอดได้เราจึงสามารถใช้แอตทริบิวต์นามธรรมที่มีฟังก์ชั่นเดียวกันหรือลักษณะเดียวกันในระบบโครงสร้างคลาสลำดับชั้นอย่างชัดเจน ด้วยการขยายตัวของข้อกำหนดของซอฟต์แวร์อย่างต่อเนื่องการแบ่งงานมืออาชีพมากขึ้นกำลังกลายเป็นซีรีส์มากขึ้นเรื่อย ๆ และจำนวนการใช้งานแอปพลิเคชัน OOP ที่เพิ่มขึ้นก็ทำให้เกิดปัญหาบางอย่างที่ OOP ไม่สามารถแก้ได้ดี
ตอนนี้สมมติว่ามีรหัสสามชิ้นที่คล้ายกันอย่างสมบูรณ์ในระบบซึ่งมักจะเสร็จสมบูรณ์โดย "การคัดลอก" และ "วาง" ซอฟต์แวร์ที่พัฒนาขึ้นด้วยวิธีนี้แสดงในรูป:
ผู้อ่านอาจค้นพบข้อบกพร่องของวิธีการนี้ หากวันหนึ่งรหัสที่มีพื้นหลังสีน้ำเงินต้องได้รับการแก้ไขเราควรแก้ไขสถานที่สามแห่งในเวลาเดียวกันหรือไม่? หากไม่เพียง แต่สถานที่ทั้งสามนี้จะมีรหัสนี้ แต่ 100 หรือ 1,000 แห่งจะเป็นอย่างไรผลที่ตามมาคืออะไร?
การบันทึกมีอยู่ทุกที่ในรหัส - ก่อนอื่นดูตัวอย่าง:
เพื่อติดตามการทำงานของแอปพลิเคชันมีหลายวิธีที่ต้องใช้ข้อมูลการบันทึก เรามักจะเขียนสิ่งนี้:
// ดูบทความ "log4j บทนำ" สำหรับ log4j นำเข้า org.apache.log4j.logger; บุคคลระดับสาธารณะ {logger ส่วนตัว logger = logger.getLogger (person.class); โมฆะสาธารณะการนอนหลับสาธารณะ () {logger.info ("เริ่มต้นการดำเนินการ:" + วันที่ใหม่); วันที่ ());} การกินโมฆะสาธารณะ () {logger.info ("เริ่มเวลาดำเนินการ:" + วันที่ใหม่ ()); วันที่ () "); System.out.println (" การฟักตัว "); logger.info (" "การดำเนินการสิ้นสุดเวลา:" + วันที่ใหม่ () ");}}คำถาม: ข้อเสียคืออะไร?
l สับสนความรับผิดชอบของวิธีการทางธุรกิจเอง
ภาระงานบำรุงรักษามีขนาดใหญ่มาก
2 โซลูชัน 1
พร็อกซีแบบคงที่:
1. คุณจำเป็นต้องรู้ว่าคลาส Core Class (คลาสพร็อกซี) คือและมีวิธีการใดบ้าง
2. รหัสที่ไม่ใช่คอร์ต้องทำซ้ำหลายครั้งซึ่งทำให้โครงสร้างรหัสดูเหมือนจะป่องและสร้างความซ้ำซ้อนของรหัส
3. คลาสที่ไม่ใช่คอร์ (คลาสพร็อกซี) จำเป็นต้องใช้อินเทอร์เฟซที่ใช้โดยคลาสแกน (คลาสพร็อกซี) นั่นคือพวกเขาจำเป็นต้องใช้อินเทอร์เฟซทั่วไป แต่อินเทอร์เฟซที่ใช้โดยคลาสแกน (คลาสพร็อกซี)
จุดประสงค์ของ L คือการแยกรหัสธุรกิจออกจากรหัสบันทึกอย่างสมบูรณ์และบรรลุการมีเพศสัมพันธ์แบบหลวม
วัตถุพร็อกซีและวัตถุพร็อกซีจะต้องใช้อินเทอร์เฟซเดียวกันใช้บริการที่เกี่ยวข้องสำหรับการเข้าสู่ระบบในวัตถุพร็อกซีและเรียกวัตถุพร็อกซีเมื่อจำเป็นในขณะที่วัตถุพร็อกซีจะรักษารหัสธุรกิจเท่านั้น
การดำเนินการตามพร็อกซีแบบคงที่
1) กำหนดอินเทอร์เฟซ:
อินเทอร์เฟซสาธารณะ Iperson {Public นามธรรม Void Sleep (); การกินโมฆะนามธรรมสาธารณะ ();}2) คลาสพร็อกซี
บุคคลระดับสาธารณะใช้ iperson {public void sleep () {system.out.println ("sleeping");} การกินโมฆะสาธารณะ () {system.out.println ("กิน");}}3) คลาสตัวแทน
นำเข้า org.apache.log4j.logger; Public Class Personproxy ใช้ iperson {ส่วนตัว Iperson บุคคล; Logger ส่วนตัว logger = logger.getLogger (personproxy.class); บุคคลสาธารณะ persproxy (iperson person) {this.person = person;} การกินโมฆะสาธารณะ วันที่ () "); person.eating (); logger.info (" "การดำเนินการสิ้นสุดเวลา:" + วันที่ใหม่ () ");} โมฆะสาธารณะนอนหลับ () {logger.info (" เริ่มต้นเวลาดำเนินการ: "วันที่ใหม่ ()"); sleep (); logger.info ("4) คลาสทดสอบ
แพ็คเกจ com.aptech.aop2; Public Class Persontest {โมฆะสาธารณะคงที่หลัก (String [] args) {iperson proxy = personproxy ใหม่ (บุคคลใหม่ ()); proxy.eating (); proxy.sleep ();}}}}}}ข้อเสียของพร็อกซีแบบคงที่:
อินเทอร์เฟซพร็อกซีสามารถให้บริการวัตถุประเภทหนึ่งเท่านั้น มันไร้ความสามารถสำหรับโครงการที่มีขนาดใหญ่กว่าเล็กน้อย
3 สารละลาย 2-dynamic agent
InvocationHandler: แต่ละคลาสพร็อกซีแบบไดนามิกจะต้องใช้อินเทอร์เฟซ InvocationHandler และแต่ละอินสแตนซ์ของคลาสพร็อกซีจะเชื่อมโยงกับตัวจัดการ เมื่อเราเรียกวิธีการผ่านวัตถุพร็อกซีการเรียกใช้วิธีนี้จะถูกส่งต่อไปยังวิธีการเรียกใช้อินเทอร์เฟซ InvocationHandler สำหรับการโทร
หลังจาก JDK1.3 มีการเพิ่มฟังก์ชั่นพร็อกซีแบบไดนามิกที่สามารถช่วยในการพัฒนาได้ ไม่จำเป็นต้องเขียนวัตถุพร็อกซีเฉพาะสำหรับวัตถุและวิธีการเฉพาะ การใช้พร็อกซิงแบบไดนามิกสามารถสร้างตัวจัดการให้บริการแต่ละวัตถุ
การออกแบบคลาสของโปรเซสเซอร์จะต้องใช้อินเตอร์เฟส java.lang.reflect.invocationHandler
พร็อกซีแบบไดนามิกที่ใช้งานผ่านอินเตอร์เฟส InvocationHandler สามารถพร็อกซีคลาสการใช้งานของอินเทอร์เฟซเท่านั้น
การใช้งานพร็อกซีแบบไดนามิก
1) ตัวจัดการ
ระดับสาธารณะ Dynaproxyhandler ใช้ InvocationHandler {Logger ส่วนตัว logger = logger.getLogger (dynaproxyhandler.class); เป้าหมายวัตถุส่วนตัว; // พร็อกซีวัตถุโมฆะสาธารณะ (เป้าหมายวัตถุ) {this.target = target;} วัตถุสาธารณะ วันที่ ()); Object result = method.invoke (เป้าหมาย, args); logger.info ("เวลาสิ้นสุดการดำเนินการ:" + วันที่ใหม่ ()); ผลตอบแทน; // ผลการดำเนินการส่งคืนผลการดำเนินการ}}}}2) โรงงานสำหรับตัวแทนการผลิต
นำเข้า java.lang.reflect.proxy; คลาสสาธารณะ Dynaproxyfactory {// obj เป็นวัตถุพร็อกซีวัตถุสาธารณะคงที่ getProxy (Object obj) {dynaproxyhandler handler = ใหม่ dynaproxyhandler (); handler.settarget (obj); obj.getClass (). getInterfaces (), handler);}}3) คลาสทดสอบ
PUSTIC PERSONTEST ระดับสาธารณะ {โมฆะสาธารณะคงที่หลัก (String [] args) {iPerson person = (iperson) dynaproxyfactory.getProxy (ใหม่ ()); // ส่งคืนคลาสพร็อกซีคลาสพร็อกซีถูกสร้างขึ้นโดย JVM ในหน่วยความจำ คลาสนี้ใช้อินเทอร์เฟซทั้งหมด (ทุกวิธี) ของอาร์เรย์อินเตอร์เฟสที่เข้ามาสรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของพร็อกซีสปริงคงที่และรหัสพร็อกซีแบบไดนามิกในบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
คำอธิบายการกำหนดค่าและการวิเคราะห์ทั่วไปของฤดูใบไม้ผลิ
SpringMVC Interceptor ใช้การลงชื่อเข้าใช้ครั้งเดียว
การเขียนโปรแกรม Java ของตัวอย่างการเข้าสู่ระบบ SpringMVC Simple Login
หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!