في عالم Quarkus، يعد عالم حقن التبعية غنيًا ومتعدد الاستخدامات، مما يوفر للمطورين العديد من الأدوات لإدارة الحبوب والتحكم فيها. إحدى هذه الأدوات هي مفهوم الفاصوليا الاصطناعية. تعد الفاصوليا الاصطناعية آلية تمديد قوية تسمح لك بتسجيل الفاصوليا التي لا تشتق سماتها من فئة أو طريقة أو حقل Java. بدلاً من ذلك، يتم تعريف كافة سمات الحبة الاصطناعية بواسطة ملحق.
في هذه المقالة، سنلقي نظرة عميقة على عالم الفاصوليا الاصطناعية في كواركوس. سنستكشف الحاجة إلى الفاصوليا الاصطناعية وتطبيقاتها العملية وكيفية إنشائها واستخدامها في تطبيقات Quarkus الخاصة بك.
في Quarkus، تعد الفاصوليا هي اللبنات الأساسية لتطبيقك، والتي تتم إدارتها بواسطة إطار عمل السياقات وحقن التبعية (CDI). عادةً ما تكون وحدات CDI عبارة عن فئات Java تم شرحها باستخدام تعليقات توضيحية مختلفة لـ CDI مثل @ApplicationScoped أو @RequestScoped أو @Inject. هذه التعليقات التوضيحية
السماح لـ CDI بإدارة دورة حياة الحبوب وحقنها تلقائيًا.
ومع ذلك، هناك مواقف قد تحتاج فيها إلى تسجيل حبة لا تتناسب تمامًا مع نموذج CDI التقليدي. هذا هو المكان الذي تلعب فيه الفاصوليا الاصطناعية. يتم إنشاء الفاصوليا الاصطناعية عن طريق الامتدادات ويتم تحديد سماتها بالكامل من خلال هذه الامتدادات. في عالم CDI العادي، يمكنك تحقيق ذلك باستخدام أساليب AfterBeanDiscovery.addBean() وSyntheticComponents.addBean(). في Quarkus، يتم تحقيق ذلك باستخدام ArtificialBeanBuildItem.
إذن، متى قد تحتاج إلى استخدام الفاصوليا الاصطناعية في كواركوس؟ تعتبر الفاصوليا الاصطناعية أداة قوية عندما:
دمج مكتبات الطرف الثالث: أنت تعمل مع مكتبة طرف ثالث لا تحتوي على تعليقات توضيحية لـ CDI ولكن يجب دمجها في التطبيق المستند إلى CDI. تسمح لك الفاصوليا الاصطناعية بسد هذه الفجوة.
تسجيل الفول الديناميكي: تحتاج إلى تسجيل الفول ديناميكيًا في وقت التشغيل، اعتمادًا على التكوين أو عوامل أخرى. تمنحك الفاصوليا الاصطناعية المرونة اللازمة لإنشاء الحبوب وتسجيلها بسرعة.
إدارة الفول المخصصة: أنت تحتاج إلى تحكم دقيق في نطاق وسلوك الحبة التي لا يمكن تحقيقها باستخدام التعليقات التوضيحية القياسية لـ CDI.
تنفيذ الفاصوليا المتخصصة: أنت تريد إنشاء فاصوليا متخصصة ذات سمات فريدة لا تتوافق مع فئات أو أساليب Java التقليدية.
محاكاة التبعيات للاختبار: توفر الفاصوليا الاصطناعية طريقة مفيدة للتخلص من التبعيات وحقن تطبيقات وهمية لأغراض الاختبار.
يتم استخدام SynthesisFinishedBuildItem للإشارة إلى اكتمال عملية اكتشاف وتسجيل حبة CDI. يتيح ذلك للامتدادات معرفة متى يكون التفاعل آمنًا مع الوحدات التي تم تسجيلها.
على سبيل المثال:
@BuildStep void onSynthesisFinished(SynthesisFinishedBuildItem synthesisFinished){ // CDI bean registration is complete, can now safely interact with beans }
يتم استخدام ArtificialBeansRuntimeInitBuildItem لتسجيل رد الاتصال الذي سيتم استدعاؤه في وقت التشغيل بعد تهيئة جميع الفاصوليا الاصطناعية. يعد هذا مفيدًا إذا كنت بحاجة إلى تنفيذ منطق تهيئة إضافي يتضمن الفاصوليا الاصطناعية.
على سبيل المثال:
@BuildStep SyntheticBeansRuntimeInitBuildItem initSyntheticBeans(){ return new SyntheticBeansRuntimeInitBuildItem(ids->{ // Perform logic with initialized synthetic beans }); }
رد الاتصال الذي تم تمريره إلى ArtificialBeansRuntimeInitBuildItem سوف يتلقى مجموعة
باختصار، يشير SynthesisFinishedBuildItem إلى اكتشاف الفاصوليا، بينما يسمح ArtificialBeansRuntimeInitBuildItem بتهيئة المنطق اعتمادًا على الفاصوليا الاصطناعية.
في Quarkus، يعد إنشاء الحبوب الاصطناعية عملية مباشرة، وذلك بفضل فئة ArtificialBeanBuildItem. دعونا نتعرف على خطوات إنشاء واستخدام الفاصوليا الاصطناعية:
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!"); } }
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
في هذا المثال:
لذا، فإننا نطلب من Quarkus إنشاء طريقة تبدو مثل:
MySyntheticBean createSyntheticBean(){ return new MySyntheticBean(); }
سيتم بعد ذلك استدعاء هذه الطريقة التي تم إنشاؤها لإنشاء مثيل لـ MySyntheticBean عندما يلزم حقنها أو استخدامها.
السبب في استخدام إنشاء الكود الثانوي هو أن الفاصوليا الاصطناعية لا تتوافق مع فئات/طرق Java الحقيقية، لذلك يتعين علينا إنشاء طريقة صريحة لإنشاء مثيل لها
يتم تسجيل مخرجات ArtificialBeanBuildItem بواسطة الكود الثانوي في وقت الإنشاء. وهذا يحد من كيفية إنشاء المثيلات في وقت التشغيل. الخيارات الشائعة هي:
يعد أسلوب @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(){ RuntimeValuebean= //... return SyntheticBeanBuildItem .configure(MySyntheticBean.class) .runtimeValue(bean); }
يمكن أن تأتي قيمة وقت التشغيل من مسجل أو مورد أو وكيل وما إلى ذلك.
لذا باختصار:
يحقق كلاهما نفس الهدف المتمثل في توفير مثيل وقت التشغيل، ولكن بطرق مختلفة قليلاً.
عندما يتعلق الأمر بتوفير مثيلات وقت التشغيل للفاصوليا الاصطناعية في Quarkus، سأفكر في استخدام المسجلات (عبرRecord) ليكون نهجًا أكثر تقدمًا مقارنةً بالتوليد المباشر للكود الثانوي
باستخدام .creator() أو توفير RuntimeValues بسيطة.
إليك بعض الأسباب التي تجعل استخدام المسجلات أكثر تقدمًا:
باختصار، توفر طرق المسجل مزيدًا من التغليف والمرونة والوصول إلى بيانات وخدمات وقت التشغيل لإنشاء مثيل للفاصوليا الاصطناعية. إنها تسمح بمنطق أكثر تقدمًا لإنتاج الفول مقارنة بتوليد الكود الثانوي المباشر.
ومع ذلك، لا يزال من الممكن أن يكون إنشاء الكود الثانوي المباشر باستخدام .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()); }
النقاط الأساسية هي:
باختصار، يمكن تهيئة الفاصوليا الاصطناعية بتكاسل أثناء 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، وانتقل بحقن التبعية الخاص بك إلى المستوى التالي!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3