"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > क्वार्कस में सिंथेटिक बीन्स की खोज। एक शक्तिशाली विस्तार तंत्र

क्वार्कस में सिंथेटिक बीन्स की खोज। एक शक्तिशाली विस्तार तंत्र

2024-09-02 को प्रकाशित
ब्राउज़ करें:562

Exploring Synthetic Beans in Quarkus. A Powerful Extension Mechanism

क्वार्कस की दुनिया में, निर्भरता इंजेक्शन का क्षेत्र समृद्ध और बहुमुखी है, जो डेवलपर्स को बीन्स को प्रबंधित और नियंत्रित करने के लिए कई उपकरण प्रदान करता है। ऐसा ही एक उपकरण सिंथेटिक बीन्स की अवधारणा है। सिंथेटिक बीन्स एक शक्तिशाली विस्तार तंत्र है जो आपको उन बीन्स को पंजीकृत करने की अनुमति देता है जिनकी विशेषताएँ जावा क्लास, विधि या फ़ील्ड से प्राप्त नहीं होती हैं। इसके बजाय, सिंथेटिक बीन की सभी विशेषताओं को एक एक्सटेंशन द्वारा परिभाषित किया गया है।

इस लेख में, हम क्वार्कस में सिंथेटिक बीन्स की दुनिया में गहराई से उतरेंगे। हम सिंथेटिक बीन्स की आवश्यकता, उनके व्यावहारिक अनुप्रयोगों और उन्हें आपके क्वार्कस अनुप्रयोगों में बनाने और उपयोग करने के तरीके का पता लगाएंगे।

सिंथेटिक बीन्स को समझना

क्वार्कस में, बीन्स आपके एप्लिकेशन के निर्माण खंड हैं, जो संदर्भ और निर्भरता इंजेक्शन (सीडीआई) ढांचे द्वारा प्रबंधित होते हैं। आमतौर पर, CDI बीन्स जावा क्लासेस हैं जिन्हें विभिन्न CDI एनोटेशन जैसे @ApplicationScoped, @RequestScoped, या @Inject के साथ एनोटेट किया जाता है। ये टिप्पणियाँ
सीडीआई को बीन्स के जीवनचक्र और इंजेक्शन को स्वचालित रूप से प्रबंधित करने की अनुमति दें।

हालाँकि, ऐसी स्थितियाँ हैं जहाँ आपको एक ऐसे बीन को पंजीकृत करने की आवश्यकता हो सकती है जो पारंपरिक सीडीआई मॉडल में अच्छी तरह से फिट नहीं होता है। यहीं पर सिंथेटिक बीन्स चलन में आती हैं। सिंथेटिक बीन्स एक्सटेंशन द्वारा बनाए जाते हैं और उनके गुण पूरी तरह से इन एक्सटेंशन द्वारा परिभाषित होते हैं। नियमित सीडीआई की दुनिया में, आप इसे AfterBeanDiscotory.addBean() और SyntheticComponents.addBean() तरीकों का उपयोग करके हासिल करेंगे। क्वार्कस में, यह SyntheticBeanBuildItem का उपयोग करके पूरा किया जाता है।

आपको सिंथेटिक बीन्स की आवश्यकता कब होती है?

तो, आपको क्वार्कस में सिंथेटिक बीन्स का उपयोग करने की आवश्यकता कब पड़ सकती है? सिंथेटिक बीन्स एक शक्तिशाली उपकरण हैं जब:

  1. तृतीय-पक्ष पुस्तकालयों को एकीकृत करना: आप एक तृतीय-पक्ष पुस्तकालय के साथ काम कर रहे हैं जिसमें सीडीआई एनोटेशन नहीं है लेकिन इसे आपके सीडीआई-आधारित एप्लिकेशन में एकीकृत करने की आवश्यकता है। सिंथेटिक बीन्स आपको इस अंतर को पाटने की अनुमति देते हैं।

  2. डायनेमिक बीन पंजीकरण: आपको कॉन्फ़िगरेशन या अन्य कारकों के आधार पर रनटाइम पर बीन्स को गतिशील रूप से पंजीकृत करने की आवश्यकता है। सिंथेटिक बीन्स आपको तुरंत बीन्स बनाने और पंजीकृत करने की सुविधा देते हैं।

  3. अनुकूलित बीन प्रबंधन: आपको बीन के दायरे और व्यवहार पर सूक्ष्म नियंत्रण की आवश्यकता होती है जिसे मानक सीडीआई एनोटेशन के साथ हासिल नहीं किया जा सकता है।

  4. विशेषीकृत बीन्स को लागू करना: आप अद्वितीय विशेषताओं के साथ विशेष बीन्स बनाना चाहते हैं जो पारंपरिक जावा कक्षाओं या विधियों के अनुरूप नहीं हैं।

  5. परीक्षण के लिए मॉकिंग निर्भरता: सिंथेटिक बीन्स परीक्षण उद्देश्यों के लिए निर्भरता को मॉक करने और मॉक कार्यान्वयन को इंजेक्ट करने का एक उपयोगी तरीका प्रदान करते हैं।

सिंथेसिसफिनिश्डबिल्डआइटम

सिंथेसिसफिनिश्डबिल्डआइटम का उपयोग यह इंगित करने के लिए किया जाता है कि सीडीआई बीन खोज और पंजीकरण प्रक्रिया पूरी हो गई है। यह एक्सटेंशन को यह जानने की अनुमति देता है कि पंजीकृत बीन्स के साथ इंटरैक्ट करना कब सुरक्षित है।

उदाहरण के लिए:

@BuildStep  
void onSynthesisFinished(SynthesisFinishedBuildItem synthesisFinished){
    // CDI bean registration is complete, can now safely interact with beans
    }

SyntheticBeansRuntimeInitBuildItem

SyntheticBeansRuntimeInitBuildItem का उपयोग कॉलबैक पंजीकृत करने के लिए किया जाता है जिसे सभी सिंथेटिक बीन्स प्रारंभ होने के बाद रनटाइम पर लागू किया जाएगा। यदि आपको सिंथेटिक बीन्स को शामिल करते हुए अतिरिक्त आरंभीकरण तर्क निष्पादित करने की आवश्यकता है तो यह उपयोगी है।

उदाहरण के लिए:

@BuildStep
SyntheticBeansRuntimeInitBuildItem initSyntheticBeans(){

    return new SyntheticBeansRuntimeInitBuildItem(ids->{
    // Perform logic with initialized synthetic beans
    });

    }

SyntheticBeansRuntimeInitBuildItem को दिए गए कॉलबैक को एक Set प्राप्त होगा जिसमें सभी आरंभिक सिंथेटिक बीन्स की आईडी होंगी।

तो संक्षेप में, सिंथेसिसफिनिश्डबिल्डआइटम इंगित करता है कि बीन की खोज हो गई है, जबकि सिंथेटिकबीन्सरनटाइमइनिटबिल्डआइटम सिंथेटिक बीन्स के आधार पर तर्क को आरंभ करने की अनुमति देता है।

SyntheticBeanBuildItem के साथ सिंथेटिक बीन्स बनाना

क्वार्कस में, सिंथेटिक बीनबिल्डआइटम क्लास के लिए धन्यवाद, सिंथेटिक बीन्स बनाना एक सीधी प्रक्रिया है। आइए सिंथेटिक बीन बनाने और उपयोग करने के चरणों पर चलें:

  1. सिंथेटिक बीन क्लास बनाएं: सिंथेटिक बीन क्लास को परिभाषित करके प्रारंभ करें। यह क्लास आपके सिंथेटिक बीन की नींव होगी।
package com.iqnev;

public class MySyntheticBean {

  // Define the behavior and attributes of your synthetic bean
  public void printMessage() {
    System.out.println("Hello from synthetic bean!");
  }
}
  1. एक क्वार्कस एक्सटेंशन बनाएं: आपको अपने सिंथेटिक बीन को पंजीकृत करने के लिए एक क्वार्कस एक्सटेंशन बनाने की आवश्यकता होगी। यह एक्सटेंशन क्लास आपके बीन को कॉन्फ़िगर करने के लिए SyntheticBeanBuildItem का उपयोग करेगा।

बाइटकोड जनरेशन दृष्टिकोण

package com.iqnev;

import io.quarkus.arc.deployment.SyntheticBeanBuildItem;

public class MySyntheticBeanExtension {

  @BuildStep
  SyntheticBeanBuildItem syntheticBean() {
    return SyntheticBeanBuildItem
        .configure(MySyntheticBean.class)
        .scope(ApplicationScoped.class)
        .creator(mc -> {
          mc.returnValue(new MySyntheticBean());
        })
        .done();
  }
}

SyntheticBeanBuildItem पर .creator() विधि का उपयोग बाइटकोड उत्पन्न करने के लिए किया जाता है जो रनटाइम पर सिंथेटिक बीन के उदाहरण बनाएगा।

.creator() को दिया गया तर्क एक उपभोक्ता है जो एक विधि के अंदर जावा बाइटकोड उत्पन्न करने की अनुमति देता है।

इस उदाहरण में:

  1. mc मेथडक्रिएटर उदाहरण है
  2. mc.returnValue(new MySyntheticBean()) MySyntheticBean का एक नया उदाहरण बनाने और इसे विधि से वापस करने के लिए बाइटकोड उत्पन्न करता है।

इसलिए अनिवार्य रूप से, हम क्वार्कस को एक ऐसी विधि तैयार करने के लिए कह रहे हैं जो कुछ इस तरह दिखती है:

MySyntheticBean createSyntheticBean(){
    return new MySyntheticBean();
    }

इस जेनरेट की गई विधि को तब MySyntheticBean को इंस्टेंट करने के लिए बुलाया जाएगा जब इसे इंजेक्ट करने या उपयोग करने की आवश्यकता होगी।

बायटेकोड पीढ़ी का उपयोग करने का कारण यह है कि सिंथेटिक बीन्स वास्तविक जावा कक्षाओं/विधियों के अनुरूप नहीं हैं, इसलिए हमें उन्हें तुरंत चालू करने के लिए स्पष्ट रूप से एक विधि उत्पन्न करनी होगी

SyntheticBeanBuildItem का आउटपुट बिल्ड समय पर रिकॉर्ड किया गया बाइटकोड है। यह सीमित करता है कि रनटाइम पर इंस्टेंस कैसे बनाए जाते हैं। सामान्य विकल्प हैं:

  1. सीधे .creator() के माध्यम से बाइटकोड जेनरेट करें
  2. बीनक्रिएटर उपवर्ग का उपयोग करें
  3. @Recorder विधि के माध्यम से उदाहरण तैयार करें

रिकॉर्डर दृष्टिकोण

@Record और .runtimeValue() दृष्टिकोण क्वार्कस में सिंथेटिक बीन्स के लिए उदाहरण प्रदान करने के वैकल्पिक तरीके हैं।

यह आपको @Record(STATIC_INIT) के साथ एनोटेटेड रिकॉर्डर क्लास विधि के माध्यम से सिंथेटिक बीन को इंस्टेंट करने की अनुमति देता है।

उदाहरण के लिए:

@Recorder
public class MyRecorder {

  @Record(STATIC_INIT)
  public MySyntheticBean createBean() {
    return new MySyntheticBean();
  }

}

  @BuildStep
  SyntheticBeanBuildItem syntheticBean(MyRecorder recorder) {
    return SyntheticBeanBuildItem
        .configure(MySyntheticBean.class)
        .runtimeValue(recorder.createBean());
  }

यहां .runtimeValue() बीन को इंस्टेंट करने के लिए रिकॉर्डर विधि का संदर्भ देता है। यह सिंथेटिक बीन इंस्टेंस प्रदान करने के लिए सीधे RuntimeValue पास करने की अनुमति देता है।

उदाहरण के लिए:

@BuildStep 
SyntheticBeanBuildItem syntheticBean(){

    RuntimeValue bean= //...

    return SyntheticBeanBuildItem
    .configure(MySyntheticBean.class)
    .runtimeValue(bean);

    }

RuntimeValue एक रिकॉर्डर, आपूर्तिकर्ता, प्रॉक्सी आदि से आ सकता है।

तो संक्षेप में:

  • @Record RuntimeValue उत्पन्न करने का एक तरीका है
  • .runtimeValue() SyntheticBeanBuildItem पर RuntimeValue सेट करता है

वे दोनों रनटाइम इंस्टेंस प्रदान करने का एक ही लक्ष्य प्राप्त करते हैं, बस थोड़े अलग तरीकों से।

जब क्वार्कस में सिंथेटिक बीन्स के लिए रनटाइम इंस्टेंस प्रदान करने की बात आती है, तो मैं सीधे बायटेकोड उत्पन्न करने की तुलना में रिकॉर्डर (@Record के माध्यम से) का उपयोग अधिक उन्नत दृष्टिकोण के रूप में करने पर विचार करूंगा।
.creator() के साथ या सरल RuntimeValues ​​की आपूर्ति के साथ।

यहां कुछ कारण बताए गए हैं कि रिकॉर्डर का उपयोग अधिक उन्नत क्यों हो सकता है:

  • अधिक एनकैप्सुलेशन - बीन्स को तुरंत चालू करने का तर्क सीधे बिल्ड चरणों के बजाय एक अलग रिकॉर्डर वर्ग में निहित है। इससे बिल्ड स्टेप्स दुबले रहते हैं।
  • पुन: उपयोग - निर्माता तर्क को फिर से लिखने के बजाय कई सिंथेटिक बीन्स में रिकॉर्डर विधियों का पुन: उपयोग किया जा सकता है।
  • रनटाइम डेटा - रिकॉर्डर विधियां रनटाइम पर निष्पादित होती हैं ताकि वे बीन्स के निर्माण के लिए रनटाइम संसाधनों, कॉन्फ़िगरेशन, सेवाओं आदि का लाभ उठा सकें।
  • निर्भरता इंजेक्शन - रिकॉर्डर विधियां अन्य सेवाओं को इंजेक्ट कर सकती हैं।
  • जीवन चक्र नियंत्रण - @Record(STATIC_INIT) या @Record(RUNTIME_INIT) के साथ एनोटेटेड रिकॉर्डर विधियां बीन इंस्टेंटेशन जीवन चक्र पर अधिक नियंत्रण देती हैं।
  • प्रबंधित बीन्स - रिकॉर्डर के अंदर इंस्टेंटिअटेड बीन्स स्वयं सीडीआई प्रबंधित बीन्स हो सकते हैं।

तो संक्षेप में, रिकॉर्डर विधियां सिंथेटिक बीन्स को इंस्टेंट करने के लिए रनटाइम डेटा और सेवाओं तक अधिक एनकैप्सुलेशन, लचीलापन और पहुंच प्रदान करती हैं। वे प्रत्यक्ष बाइटकोड पीढ़ी की तुलना में अधिक उन्नत बीन उत्पादन तर्क की अनुमति देते हैं।

हालाँकि, .creator() के साथ प्रत्यक्ष बाइटकोड पीढ़ी अभी भी साधारण मामलों के लिए उपयोगी हो सकती है जहां रिकॉर्डर ओवरकिल हो सकते हैं। लेकिन जैसे-जैसे सिंथेटिक बीन की ज़रूरतें बढ़ती हैं, रिकॉर्डर अधिक शक्तिशाली होते हैं और
उन्नत दृष्टिकोण.

क्वार्कस में एक सिंथेटिक बीन को डिफ़ॉल्ट STATIC_INIT चरण के बजाय RUNTIME_INIT चरण के दौरान प्रारंभ करने के लिए कॉन्फ़िगर करना संभव है।

यहां एक उदाहरण है:

@BuildStep
@Record(RUNTIME_INIT)
SyntheticBeanBuildItem lazyBean(BeanRecorder recorder){

    return SyntheticBeanBuildItem
    .configure(MyLazyBean.class)
    .setRuntimeInit() // initialize during RUNTIME_INIT
    .runtimeValue(recorder.createLazyBean());

    }

मुख्य बिंदु हैं:

  • इसे RUNTIME_INIT के लिए चिह्नित करने के लिए SyntheticBeanBuildItem पर setRuntimeInit() का उपयोग करें
  • रिकॉर्डर विधि को @Record(RUNTIME_INIT) के साथ एनोटेट किया जाना चाहिए
  • रनटाइम इनिट सिंथेटिक बीन्स को STATIC_INIT के दौरान एक्सेस नहीं किया जा सकता है

तो संक्षेप में, सिंथेटिक बीन्स को उन मामलों के लिए RUNTIME_INIT के दौरान आलसी तरीके से प्रारंभ किया जा सकता है जहां उत्सुक STATIC_INIT इंस्टेंटेशन की आवश्यकता नहीं है। यह स्टार्टअप समय को अनुकूलित करने की अनुमति देता है।

सिंथेटिक बीन का उपयोग करें: अब जब आपका सिंथेटिक बीन पंजीकृत है, तो आप इसे इंजेक्ट कर सकते हैं और इसे अपने एप्लिकेशन में उपयोग कर सकते हैं।

package com.iqnev;

import javax.inject.Inject;

public class MyBeanUser {

  @Inject
  MySyntheticBean mySyntheticBean;

  public void useSyntheticBean() {
    // Use the synthetic bean in your code
    mySyntheticBean.printMessage();
  }
}

अपना एप्लिकेशन चलाना: अपना क्वार्कस एप्लिकेशन हमेशा की तरह बनाएं और चलाएं, और सिंथेटिक बीन इंजेक्शन और उपयोग के लिए उपलब्ध होगा।

निष्कर्ष

क्वार्कस में सिंथेटिक बीन्स बाहरी पुस्तकालयों को एकीकृत करने, बीन्स को गतिशील रूप से पंजीकृत करने और आपके सीडीआई-आधारित अनुप्रयोगों में बीन व्यवहार को अनुकूलित करने के लिए एक शक्तिशाली तंत्र प्रदान करते हैं। ये बीन्स, जिनकी विशेषताओं को जावा कक्षाओं के बजाय एक्सटेंशन द्वारा परिभाषित किया गया है, निर्भरता के प्रबंधन में लचीलापन और बहुमुखी प्रतिभा प्रदान करते हैं।

जैसा कि हमने इस लेख में पता लगाया है, क्वार्कस में सिंथेटिक बीन्स बनाना और उपयोग करना एक सीधी प्रक्रिया है। सिंथेटिकबीनबिल्डआइटम और क्वार्कस एक्सटेंशन का लाभ उठाकर, आप पारंपरिक सीडीआई और अधिक विशिष्ट या गतिशील बीन पंजीकरण आवश्यकताओं के बीच अंतर को सहजता से पाट सकते हैं।

जावा फ्रेमवर्क के लगातार विकसित हो रहे परिदृश्य में, क्वार्कस सिंथेटिक बीन्स जैसे अभिनव समाधान पेश करके लगातार खड़ा है, जो इसे आधुनिक, कुशल और लचीले अनुप्रयोग विकास के लिए एक आकर्षक विकल्प बनाता है। क्वार्कस में सिंथेटिक बीन्स की शक्ति को अपनाएं, और अपनी निर्भरता इंजेक्शन को अगले स्तर पर ले जाएं!

विज्ञप्ति वक्तव्य यह आलेख यहां पुन: प्रस्तुत किया गया है: https://dev.to/yanev/exploring-synthetic-beans-in-quarkus-a-powerful-extension-mechanism-fbd?1 यदि कोई उल्लंघन है, तो कृपया स्टडी_गोलंग@163.com पर संपर्क करें। इसे हटाने के लिए
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3