सबसे पहले, कोई कोड पीढ़ी नहीं चल रही है, जिसका अर्थ है: कोई CGLib, कोई बाइट-कोड पीढ़ी बिल्कुल नहीं। मौलिक दृष्टिकोण यह है कि ProxyFactory
इंटरफ़ेस को वापस करने के लिए स्प्रिंग के एपीआई का उपयोग करके एक जेडीके प्रॉक्सी उदाहरण प्रोग्रामेटिक रूप से बनाया गया है और MethodInterceptor
उदाहरण के लिए सभी कॉल्स को इंटरसेप्ट करता है और विधि को उपयुक्त स्थानों में रूट करता है:
- यदि रिपॉजिटरी को एक कस्टम कार्यान्वयन भाग के साथ प्रारंभ किया गया है ( विवरण के लिए संदर्भ प्रलेखन का वह भाग देखें), और जिस विधि को लागू किया गया है, वह उस वर्ग में लागू किया गया है, तो कॉल को वहां रूट किया जाता है।
- यदि विधि एक क्वेरी विधि है (देखें
DefaultRepositoryInformation
कि यह कैसे निर्धारित किया जाता है), तो स्टोर विशिष्ट क्वेरी निष्पादन तंत्र स्टार्टअप में उस विधि के लिए निष्पादित की जाने वाली क्वेरी को निष्पादित और निष्पादित करता है। इसके लिए एक रिज़ॉल्यूशन मैकेनिज़्म है जो विभिन्न स्थानों @Query
पर स्पष्ट रूप से घोषित प्रश्नों की पहचान करने की कोशिश करता है ( विधि का उपयोग करके , जेपीए नामांकित क्वेरीज़) अंततः विधि नाम से क्वेरी व्युत्पत्ति के लिए वापस गिर रहा है। क्वेरी तंत्र का पता लगाने के लिए, देखें JpaQueryLookupStrategy
। क्वेरी व्युत्पत्ति के लिए पार्सिंग लॉजिक पाया जा सकता है PartTree
। वास्तविक क्वेरी में स्टोर विशिष्ट अनुवाद को उदाहरण में देखा जा सकता है JpaQueryCreator
।
- यदि उपर्युक्त में से कोई भी लागू नहीं होता है, तो स्टोर-स्पेसिफिक रिपॉजिटरी बेस क्लास (
SimpleJpaRepository
जेपीए के मामले में) द्वारा कार्यान्वित की जाने वाली विधि को लागू करना पड़ता है और कॉल उसी के उदाहरण में रूट हो जाता है।
उस रूटिंग लॉजिक को लागू करने का तरीका इंटरसेप्टर है QueryExecutorMethodInterceptor
, उच्च स्तरीय रूटिंग लॉजिक यहां पाया जा सकता है ।
उन परदे के पीछे का निर्माण मानक जावा आधारित फैक्ट्री पैटर्न कार्यान्वयन में संलग्न है। उच्च-स्तरीय प्रॉक्सी निर्माण में पाया जा सकता है RepositoryFactorySupport
। स्टोर-विशिष्ट कार्यान्वयन फिर आवश्यक अवसंरचना घटक जोड़ते हैं ताकि JPA के लिए आप आगे बढ़ें और बस इस तरह कोड लिखें:
EntityManager em = … // obtain an EntityManager
JpaRepositoryFactory factory = new JpaRepositoryFactory(em);
UserRepository repository = factory.getRepository(UserRepository.class);
स्पष्ट रूप से उल्लेख करने का कारण यह है कि यह स्पष्ट हो जाना चाहिए कि, इसके मूल में, उस कोड में से किसी को भी वसंत कंटेनर को पहले स्थान पर चलाने की आवश्यकता नहीं है। यह वसंत को क्लासपाथ पर एक पुस्तकालय के रूप में चाहिए (क्योंकि हम पहिया को सुदृढ़ नहीं करना चाहते हैं), लेकिन सामान्य रूप से कंटेनर अज्ञेयवादी है।
डीआई कंटेनरों के साथ एकीकरण को कम करने के लिए हमने निश्चित रूप से स्प्रिंग जावा कॉन्फ़िगरेशन, एक एक्सएमएल नेमस्पेस, बल्कि एक सीडीआई एक्सटेंशन के साथ एकीकरण का निर्माण किया है , ताकि स्प्रिंग डेटा को सादे सीडीआई परिदृश्यों में उपयोग किया जा सके।
@Repository
पहले स्थान पर एनोटेट इंटरफेस को कैसे दिखाता है?RepositoryFactorySupport#getRepository()
शो को देखते हुए कि यह इंटरफ़ेस क्लास को एक पैरामीटर के रूप में लेता है, इसलिए इसे कहीं और खोजा जाना चाहिए। मैं विशेष रूप से यह पता लगाने की कोशिश कर रहा हूं कि एक एनोटेट इंटरफेस कैसे खोजा जा सकता है और स्वचालित रूप से एक जेडीके प्रॉक्सी बीन उत्पन्न करता है जो इंटरफ़ेस को लागू करता है, बहुत अधिक स्प्रिंग-डेटा की तरह, लेकिन एक आवेदन-विशिष्ट उद्देश्य के लिए रिपॉजिटरी से संबंधित नहीं।