ประการแรกไม่มีการสร้างรหัสเกิดขึ้นซึ่งหมายความว่า: ไม่มี CGLib ไม่มีการสร้างรหัสไบต์เลย แนวทางพื้นฐานคืออินสแตนซ์พร็อกซี JDK ถูกสร้างขึ้นโดยใช้โปรแกรมโดยใช้ProxyFactory
API ของ Spring เพื่อสำรองอินเทอร์เฟซและMethodInterceptor
สกัดกั้นการเรียกทั้งหมดไปยังอินสแตนซ์และกำหนดเส้นทางวิธีการไปยังตำแหน่งที่เหมาะสม:
- หากที่เก็บเริ่มต้นด้วยส่วนการนำไปใช้งานที่กำหนดเอง (ดูรายละเอียดในส่วนของเอกสารอ้างอิง ) และวิธีการเรียกใช้ถูกนำไปใช้ในคลาสนั้นการเรียกจะถูกกำหนดเส้นทางไปที่นั่น
- ถ้าเมธอดนั้นเป็นเมธอด
DefaultRepositoryInformation
คิวรี(ดูวิธีการกำหนด) กลไกการดำเนินการเคียวรีที่จัดเก็บจะเริ่มทำงานและเรียกใช้คิวรีที่กำหนดให้ดำเนินการสำหรับเมธอดนั้นเมื่อเริ่มต้น ด้วยเหตุนี้กลไกการแก้ปัญหาจึงถูกนำมาใช้ซึ่งพยายามระบุการสืบค้นที่ประกาศไว้อย่างชัดเจนในที่ต่างๆ (โดยใช้@Query
วิธีการค้นหาชื่อ JPA) ในที่สุดก็กลับไปสู่การสืบค้นที่มาจากชื่อเมธอด JpaQueryLookupStrategy
สำหรับการตรวจสอบกลไกการสอบถามดู ตรรกะการแยกวิเคราะห์สำหรับการสร้างแบบสอบถามสามารถพบได้ในPartTree
. JpaQueryCreator
แปลร้านที่เฉพาะเจาะจงลงในแบบสอบถามที่เกิดขึ้นจริงสามารถมองเห็นได้เช่นใน
- หากไม่มีวิธีใดข้างต้นใช้วิธีการที่ดำเนินการจะต้องถูกนำไปใช้โดยคลาสฐานที่เก็บเฉพาะที่เก็บ (
SimpleJpaRepository
ในกรณีของ JPA) และการเรียกจะถูกกำหนดเส้นทางไปยังอินสแตนซ์ของสิ่งนั้น
วิธีการดำเนินการสกัดกั้นที่เส้นทางตรรกะเป็นQueryExecutorMethodInterceptor
ระดับสูงเส้นทางตรรกะที่สามารถพบได้ที่นี่
การสร้างพร็อกซีเหล่านั้นถูกห่อหุ้มไว้ในการใช้งานรูปแบบโรงงานที่ใช้ Java มาตรฐาน การสร้างพร็อกซีระดับสูงสามารถพบได้ในRepositoryFactorySupport
. การใช้งานเฉพาะร้านค้าจากนั้นเพิ่มส่วนประกอบโครงสร้างพื้นฐานที่จำเป็นเพื่อให้ JPA สามารถดำเนินการต่อได้และเขียนโค้ดดังนี้:
EntityManager em = … // obtain an EntityManager
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
UserRepository repository = factory.getRepository(UserRepository.class);
เหตุผลที่ฉันพูดถึงอย่างชัดเจนก็คือควรชัดเจนว่าโดยพื้นฐานแล้วโค้ดนั้นไม่จำเป็นต้องใช้ Spring container ในการทำงานตั้งแต่แรก มันต้องการ Spring เป็นไลบรารีบน classpath (เพราะเราไม่ต้องการสร้างวงล้อใหม่) แต่โดยทั่วไปแล้วคอนเทนเนอร์ไม่เชื่อเรื่องพระเจ้า
เพื่อความสะดวกในการรวมกับคอนเทนเนอร์ DI เราได้สร้างการผสานรวมกับการกำหนดค่า Spring Java ซึ่งเป็นเนมสเปซ XML แต่ยังรวมถึงส่วนขยาย CDIเพื่อให้ Spring Data สามารถใช้ในสถานการณ์ CDI ธรรมดาได้
@Repository
อินเทอร์เฟซที่มีคำอธิบายประกอบตั้งแต่แรกได้หรือไม่? เมื่อดูที่RepositoryFactorySupport#getRepository()
แสดงว่าใช้คลาสอินเทอร์เฟซเป็นพารามิเตอร์ดังนั้นจึงต้องค้นพบที่อื่น ฉันพยายามหาวิธีค้นหาอินเทอร์เฟซที่มีคำอธิบายประกอบและสร้าง JDK proxy bean โดยอัตโนมัติซึ่งใช้อินเทอร์เฟซเหมือนกับข้อมูลสปริง แต่สำหรับวัตถุประสงค์เฉพาะแอปพลิเคชันที่ไม่เกี่ยวข้องกับที่เก็บ