"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > استكشاف الفاصوليا الاصطناعية في كواركوس. آلية تمديد قوية

استكشاف الفاصوليا الاصطناعية في كواركوس. آلية تمديد قوية

تم النشر بتاريخ 2024-09-02
تصفح:953

Exploring Synthetic Beans in Quarkus. A Powerful Extension Mechanism

في عالم Quarkus، يعد عالم حقن التبعية غنيًا ومتعدد الاستخدامات، مما يوفر للمطورين العديد من الأدوات لإدارة الحبوب والتحكم فيها. إحدى هذه الأدوات هي مفهوم الفاصوليا الاصطناعية. تعد الفاصوليا الاصطناعية آلية تمديد قوية تسمح لك بتسجيل الفاصوليا التي لا تشتق سماتها من فئة أو طريقة أو حقل Java. بدلاً من ذلك، يتم تعريف كافة سمات الحبة الاصطناعية بواسطة ملحق.

في هذه المقالة، سنلقي نظرة عميقة على عالم الفاصوليا الاصطناعية في كواركوس. سنستكشف الحاجة إلى الفاصوليا الاصطناعية وتطبيقاتها العملية وكيفية إنشائها واستخدامها في تطبيقات Quarkus الخاصة بك.

فهم الفاصوليا الاصطناعية

في Quarkus، تعد الفاصوليا هي اللبنات الأساسية لتطبيقك، والتي تتم إدارتها بواسطة إطار عمل السياقات وحقن التبعية (CDI). عادةً ما تكون وحدات CDI عبارة عن فئات Java تم شرحها باستخدام تعليقات توضيحية مختلفة لـ CDI مثل @ApplicationScoped أو @RequestScoped أو @Inject. هذه التعليقات التوضيحية
السماح لـ CDI بإدارة دورة حياة الحبوب وحقنها تلقائيًا.

ومع ذلك، هناك مواقف قد تحتاج فيها إلى تسجيل حبة لا تتناسب تمامًا مع نموذج CDI التقليدي. هذا هو المكان الذي تلعب فيه الفاصوليا الاصطناعية. يتم إنشاء الفاصوليا الاصطناعية عن طريق الامتدادات ويتم تحديد سماتها بالكامل من خلال هذه الامتدادات. في عالم CDI العادي، يمكنك تحقيق ذلك باستخدام أساليب AfterBeanDiscovery.addBean() وSyntheticComponents.addBean(). في Quarkus، يتم تحقيق ذلك باستخدام ArtificialBeanBuildItem.

متى تحتاج إلى الفاصوليا الاصطناعية؟

إذن، متى قد تحتاج إلى استخدام الفاصوليا الاصطناعية في كواركوس؟ تعتبر الفاصوليا الاصطناعية أداة قوية عندما:

  1. دمج مكتبات الطرف الثالث: أنت تعمل مع مكتبة طرف ثالث لا تحتوي على تعليقات توضيحية لـ CDI ولكن يجب دمجها في التطبيق المستند إلى CDI. تسمح لك الفاصوليا الاصطناعية بسد هذه الفجوة.

  2. تسجيل الفول الديناميكي: تحتاج إلى تسجيل الفول ديناميكيًا في وقت التشغيل، اعتمادًا على التكوين أو عوامل أخرى. تمنحك الفاصوليا الاصطناعية المرونة اللازمة لإنشاء الحبوب وتسجيلها بسرعة.

  3. إدارة الفول المخصصة: أنت تحتاج إلى تحكم دقيق في نطاق وسلوك الحبة التي لا يمكن تحقيقها باستخدام التعليقات التوضيحية القياسية لـ CDI.

  4. تنفيذ الفاصوليا المتخصصة: أنت تريد إنشاء فاصوليا متخصصة ذات سمات فريدة لا تتوافق مع فئات أو أساليب Java التقليدية.

  5. محاكاة التبعيات للاختبار: توفر الفاصوليا الاصطناعية طريقة مفيدة للتخلص من التبعيات وحقن تطبيقات وهمية لأغراض الاختبار.

التوليفFinishedBuildItem

يتم استخدام SynthesisFinishedBuildItem للإشارة إلى اكتمال عملية اكتشاف وتسجيل حبة CDI. يتيح ذلك للامتدادات معرفة متى يكون التفاعل آمنًا مع الوحدات التي تم تسجيلها.

على سبيل المثال:

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

الفاصوليا الاصطناعية RuntimeInitBuildItem

يتم استخدام ArtificialBeansRuntimeInitBuildItem لتسجيل رد الاتصال الذي سيتم استدعاؤه في وقت التشغيل بعد تهيئة جميع الفاصوليا الاصطناعية. يعد هذا مفيدًا إذا كنت بحاجة إلى تنفيذ منطق تهيئة إضافي يتضمن الفاصوليا الاصطناعية.

على سبيل المثال:

@BuildStep
SyntheticBeansRuntimeInitBuildItem initSyntheticBeans(){

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

    }

رد الاتصال الذي تم تمريره إلى ArtificialBeansRuntimeInitBuildItem سوف يتلقى مجموعة تحتوي على معرفات جميع الفاصوليا الاصطناعية التي تمت تهيئتها.

باختصار، يشير SynthesisFinishedBuildItem إلى اكتشاف الفاصوليا، بينما يسمح ArtificialBeansRuntimeInitBuildItem بتهيئة المنطق اعتمادًا على الفاصوليا الاصطناعية.

إنشاء الفاصوليا الاصطناعية باستخدام ArtificialBeanBuildItem

في Quarkus، يعد إنشاء الحبوب الاصطناعية عملية مباشرة، وذلك بفضل فئة ArtificialBeanBuildItem. دعونا نتعرف على خطوات إنشاء واستخدام الفاصوليا الاصطناعية:

  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. إنشاء امتداد Quarkus: ستحتاج إلى إنشاء امتداد Quarkus لتسجيل الفول الاصطناعي الخاص بك. ستستخدم فئة الامتدادSyntheticBeanBuildItem لتكوين الفول الخاص بك.

نهج إنشاء Bytecode

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();
  }
}

يتم استخدام طريقة .creator() على ArtificialBeanBuildItem لإنشاء الكود الثانوي الذي سينشئ مثيلات للفاصوليا الاصطناعية في وقت التشغيل.

الوسيطة التي تم تمريرها إلى .creator() هي Consumer والتي تسمح بإنشاء رمز Java بايت داخل الطريقة.

في هذا المثال:

  1. mc هو مثيل MethodCreator
  2. يقوم mc.returnValue(new MySyntheticBean()) بإنشاء الكود الثانوي لإنشاء مثيل جديد لـ MySyntheticBean وإعادته من الطريقة.

لذا، فإننا نطلب من Quarkus إنشاء طريقة تبدو مثل:

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

سيتم بعد ذلك استدعاء هذه الطريقة التي تم إنشاؤها لإنشاء مثيل لـ MySyntheticBean عندما يلزم حقنها أو استخدامها.

السبب في استخدام إنشاء الكود الثانوي هو أن الفاصوليا الاصطناعية لا تتوافق مع فئات/طرق Java الحقيقية، لذلك يتعين علينا إنشاء طريقة صريحة لإنشاء مثيل لها

يتم تسجيل مخرجات ArtificialBeanBuildItem بواسطة الكود الثانوي في وقت الإنشاء. وهذا يحد من كيفية إنشاء المثيلات في وقت التشغيل. الخيارات الشائعة هي:

  1. قم بإنشاء رمز بايت مباشرة عبر .creator()
  2. استخدام فئة فرعية BeanCreator
  3. إنتاج مثيل عبر طريقة @Recorder

نهج مسجل

يعد أسلوب @Record و.runtimeValue() بمثابة طرق بديلة لتوفير مثيلات للفاصوليا الاصطناعية في Quarkus.

يسمح لك هذا بإنشاء مثيل للفاصوليا الاصطناعية عبر طريقة فئة المسجل الموضحة بـ @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);

    }

يمكن أن تأتي قيمة وقت التشغيل من مسجل أو مورد أو وكيل وما إلى ذلك.

لذا باختصار:

  • @Record هو أحد الأساليب لإنشاء قيمة RuntimeValue
  • يقوم .runtimeValue() بتعيين قيمة RuntimeValue على ArtificialBeanBuildItem

يحقق كلاهما نفس الهدف المتمثل في توفير مثيل وقت التشغيل، ولكن بطرق مختلفة قليلاً.

عندما يتعلق الأمر بتوفير مثيلات وقت التشغيل للفاصوليا الاصطناعية في Quarkus، سأفكر في استخدام المسجلات (عبرRecord) ليكون نهجًا أكثر تقدمًا مقارنةً بالتوليد المباشر للكود الثانوي
باستخدام .creator() أو توفير RuntimeValues ​​بسيطة.

إليك بعض الأسباب التي تجعل استخدام المسجلات أكثر تقدمًا:

  • المزيد من التغليف - يتم تضمين منطق إنشاء مثيل للفاصوليا في فئة مسجل منفصلة بدلاً من خطوات الإنشاء المباشرة. وهذا يحافظ على خطوات البناء هزيلة.
  • إعادة الاستخدام - يمكن إعادة استخدام أساليب المسجل عبر عدة وحدات اصطناعية بدلاً من إعادة كتابة منطق المنشئ.
  • بيانات وقت التشغيل - يتم تنفيذ أساليب المسجل في وقت التشغيل حتى تتمكن من الاستفادة من موارد وقت التشغيل والتكوينات والخدمات وما إلى ذلك لإنشاء الوحدات.
  • حقن التبعية - يمكن لطرق المسجل حقن خدمات أخرى.
  • التحكم في دورة الحياة - طرق المسجل الموضحة بـ @Record(STATIC_INIT) أو @Record(RUNTIME_INIT) تمنح المزيد من التحكم في دورة حياة إنشاء مثيل للفاصوليا.
  • الفاصوليا المُدارة - يمكن للفاصوليا التي تم إنشاؤها داخل المسجلات أن تكون في حد ذاتها حبوب مُدارة بواسطة CDI.

باختصار، توفر طرق المسجل مزيدًا من التغليف والمرونة والوصول إلى بيانات وخدمات وقت التشغيل لإنشاء مثيل للفاصوليا الاصطناعية. إنها تسمح بمنطق أكثر تقدمًا لإنتاج الفول مقارنة بتوليد الكود الثانوي المباشر.

ومع ذلك، لا يزال من الممكن أن يكون إنشاء الكود الثانوي المباشر باستخدام .creator() مفيدًا في الحالات البسيطة التي قد تكون فيها المسجلات مبالغة. ولكن مع تزايد احتياجات الحبوب الاصطناعية، أصبحت المسجلات أكثر قوة و
النهج المتقدم.

من الممكن تكوين حبة اصطناعية في Quarkus لتتم تهيئتها أثناء مرحلة RUNTIME_INIT بدلاً من مرحلة STATIC_INIT الافتراضية.

إليك مثال:

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

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

    }

النقاط الأساسية هي:

  • استخدم setRuntimeInit () على ArtificialBeanBuildItem لوضع علامة عليه لـ RUNTIME_INIT
  • يجب إضافة تعليق توضيحي إلى طريقة المسجل باستخدام @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();
  }
}

تشغيل التطبيق الخاص بك: أنشئ تطبيق Quarkus الخاص بك وقم بتشغيله كالمعتاد، وستكون الحبة الاصطناعية متاحة للحقن والاستخدام.

خاتمة

توفر الفاصوليا الاصطناعية في Quarkus آلية قوية لدمج المكتبات الخارجية، وتسجيل الفاصوليا ديناميكيًا، وتخصيص سلوك الفاصوليا في التطبيقات المستندة إلى CDI. توفر هذه الفاصوليا، التي يتم تحديد سماتها من خلال الامتدادات بدلاً من فئات Java، المرونة والتنوع في إدارة التبعيات.

كما اكتشفنا في هذه المقالة، يعد إنشاء واستخدام الفاصوليا الاصطناعية في Quarkus عملية مباشرة. من خلال الاستفادة من امتدادات ArtificialBeanBuildItem وQuarkus، يمكنك سد الفجوة بسهولة بين CDI التقليدي ومتطلبات تسجيل الفول الأكثر تخصصًا أو ديناميكية.

في المشهد المتطور باستمرار لأطر عمل Java، تواصل Quarkus التميز من خلال تقديم حلول مبتكرة مثل الفاصوليا الاصطناعية، مما يجعلها خيارًا مقنعًا لتطوير التطبيقات الحديثة والفعالة والمرنة. استمتع بقوة الفاصوليا الاصطناعية في Quarkus، وانتقل بحقن التبعية الخاص بك إلى المستوى التالي!

بيان الافراج تم إعادة نشر هذه المقالة على: https://dev.to/yanev/exploring-synthetic-beans-in-quarkus-a-powerful-extension-mechanism-fbd?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3