คำถามติดแท็ก dynamic-proxy

4
อะไรคือความแตกต่างระหว่าง JDK dynamic proxy และ CGLib?
ในกรณีของProxy Design Patternความแตกต่างระหว่างDynamic Proxy ของ JDK กับ API การสร้างรหัสแบบไดนามิกของบุคคลที่สามเช่นCGLibคืออะไร? อะไรคือความแตกต่างระหว่างการใช้ทั้งสองวิธีและเมื่อใดที่ควรจะใช้มากกว่ากัน?

2
ทางเลือกในการ java.lang.reflect.Proxy สำหรับการสร้างพร็อกซีของคลาสนามธรรม (แทนที่จะเป็นอินเทอร์เฟซ)
ตามเอกสาร : [ java.lang.reflect.] Proxyจัดเตรียมเมธอดแบบคงที่สำหรับการสร้างคลาสพร็อกซีและอินสแตนซ์แบบไดนามิกและยังเป็นซูเปอร์คลาสของคลาสพร็อกซีแบบไดนามิกทั้งหมดที่สร้างโดยเมธอดเหล่านั้น newProxyMethodวิธี (รับผิดชอบในการสร้างผู้รับมอบฉันทะแบบไดนามิก) มีลายเซ็นต่อไปนี้: public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException น่าเสียดายที่สิ่งนี้ป้องกันไม่ให้สร้างพร็อกซีแบบไดนามิกที่ขยายคลาสนามธรรมเฉพาะ (แทนที่จะใช้อินเทอร์เฟซเฉพาะ) สิ่งนี้สมเหตุสมผลเมื่อพิจารณาว่าjava.lang.reflect.Proxyเป็น "superclass ของไดนามิกพร็อกซีทั้งหมด" ดังนั้นจึงป้องกันไม่ให้คลาสอื่นเป็นซูเปอร์คลาส ดังนั้นมีทางเลือกอื่นjava.lang.reflect.Proxyที่สามารถสร้างพร็อกซีแบบไดนามิกที่สืบทอดมาจากคลาสนามธรรมเฉพาะโดยเปลี่ยนเส้นทางการเรียกทั้งหมดไปยังเมธอดนามธรรมไปยังตัวจัดการการเรียกใช้หรือไม่ ตัวอย่างเช่นสมมติว่าฉันมีคลาสนามธรรมDog: public abstract class Dog { public void bark() { System.out.println("Woof!"); } public abstract void fetch(); } มีชั้นเรียนที่อนุญาตให้ฉันทำสิ่งต่อไปนี้หรือไม่? Dog dog = SomeOtherProxy.newProxyInstance(classLoader, Dog.class, h); …

1
พร็อกซีที่ถูกกำหนดขอบเขตใน Spring คืออะไร
ดังที่เราทราบ Spring ใช้พร็อกซีเพื่อเพิ่มฟังก์ชันการทำงาน ( @Transactionalและ@Scheduledตัวอย่าง) มีสองตัวเลือก - การใช้ JDK ไดนามิกพร็อกซี่ (คลาสต้องใช้อินเตอร์เฟสที่ไม่ว่าง) หรือสร้างคลาสย่อยโดยใช้ตัวสร้างโค้ด CGLIB ฉันคิดเสมอว่า proxyMode ช่วยให้ฉันสามารถเลือกระหว่าง JDK dynamic proxy และ CGLIB แต่ฉันสามารถสร้างตัวอย่างที่แสดงว่าข้อสันนิษฐานของฉันไม่ถูกต้อง: กรณีที่ 1: ซิงเกิล: @Service public class MyBeanA { @Autowired private MyBeanB myBeanB; public void foo() { System.out.println(myBeanB.getCounter()); } public MyBeanB getMyBeanB() { return myBeanB; } } ต้นแบบ: @Service …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.