محتويات الدورة

Spring Boot / الأساسي: التركيب وعقود HTTP / الدرس 2

حقن الاعتماد وعمر الكائن المُدار

أظهر المتعاونين والملكية عبر الباني، وميّز تركيب Java العادي من اكتشاف الحاوية والنطاق وسلوك الوكيل.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • استخدام حقن الباني للمتعاون المطلوب.
  • حل تعدد الكائنات بقصد.
  • شرح النطاق المفرد والعمر والإنشاء اليدوي.

يعلن الباني ما تحتاجه الخدمة

يعني حقن الاعتماد استلام المتعاون بدلاً من البحث عن اعتماد عام خفي أو إنشائه داخلياً. يظهر معامل الباني المطلوب العلاقة ويسمح للاختبار بتوفير تنفيذ مضبوط. يستطيع Spring استخدام الباني الوحيد دون @Autowired إضافية. يختلف التحقق من المتعاون عن التحقق من طلب العمل.

فضّل قدرة صغيرة مثل Catalog على تمرير ApplicationContext كله لكل مكوّن؛ فقد يتحول إلى محدد خدمات يخفي الرسم. تفيد الواجهة عند استبدال أو حد ذي معنى، لا لكل صنف تلقائياً. تجمع الحاوية التصميم لكنها لا تختار اتجاه اعتماد منطقي نيابة عن المصمم.

أبق حد الإطار صغيراً

يعلن الجزء Catalog متعاوناً مطلوباً ويحسب قيمة مجال محدودة. ليس مشروع Boot كاملاً؛ فيلزم العقد وتنفيذ مُدار ومسح يشمل الخدمة. يبقى غير قابل للتشغيل لأن الاكتشاف والسياق لم يُختبرا. ولا ينبغي خلط حالة HTTP أو تهيئة القاعدة داخل الحساب لمجرد أنه مُدار.

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

java خدمة توضيحية بحقن الباني
package training.catalog;

import org.springframework.stereotype.Service;

@Service
public class QuoteService {
    private final Catalog catalog;
    public QuoteService(Catalog catalog) { this.catalog = catalog; }
    public int total(String code, int quantity) {
        if (quantity <= 0) throw new IllegalArgumentException("quantity");
        return Math.multiplyExact(catalog.unitPrice(code), quantity);
    }
}

تمثل Catalog قدرة سياقية؛ ويشرح الجزء قصد التركيب لا اكتشافاً مرصوداً أو تطبيقاً مُشغلاً.

تحقق من تركيب المجال مستقلاً عن Spring

يركب برنامج JDK المستقل خدمة بكتالوج مصطنع ويحسب وحدتين بسعر عشرة فيطبع 20. يتحقق من الباني والحساب لا annotations أو الوكلاء أو المسح أو المعاملات. تحديد الدليل يمنع تقديم نجاح حساب كاختبار تكامل إطار.

قد تفشل القدرة الفعلية تشغيلياً أو لا تجد المنتج؛ ميّز ذلك من سعر صفر مشروع ولا تجعل كل بديل يعيد قيمة مريحة. طابق البديل بالعقد وأبق اختبارات منفصلة للترميز والتفويض والاستمرارية. لا يثبت البديل سلوك نظام خارجي لم ينفذ فعلاً.

java نموذج تركيب مستقل عن الإطار
public class Main {
interface Catalog { int unitPrice(String code); }
static final class Quote {
 private final Catalog catalog;
 Quote(Catalog catalog) { this.catalog=java.util.Objects.requireNonNull(catalog); }
 int total(String code,int quantity) {
  if(quantity<=0) throw new IllegalArgumentException("quantity");
  return Math.multiplyExact(catalog.unitPrice(code),quantity);
 }
}
 public static void main(String[] args) throws Exception {
Catalog catalog=code->10;
Quote quote=new Quote(catalog);
System.out.println(quote.total("BOOK",2));
 }
}
الناتج المتوقع
20

تعيد القدرة 10 والخدمة 20 دون حاوية Spring أو خدمة خارجية.

النطاق المفرد لا يضمن سلامة الخيوط

النطاق المفرد الافتراضي كائن لكل تعريف في الحاوية لا كائناً جديداً لكل طلب HTTP. قد تتسرب حقول الطلب المتغيرة بين المستدعين؛ ففضّل متعاوناً ثابتاً وحالة محلية أو نطاقاً ومزامنة مبررين. لا تجمد final الكائن المرجوع إليه.

يتجاوز new العمر المُدار وسلوك الوكيل المتوقع. وقد لا يكون الوكيل النوع الداخلي نفسه في الانعكاس. مع proxyBeanMethods=false فضّل معاملات دوال @Bean للاعتماد، ولا تفترض أن استدعاءها المباشر يعيد الكائن المفرد المُدار. افهم الدلالة قبل اختصار annotations أو تغييرها.

أصلح رسم الاعتماد بدلاً من إخفائه

يختلف الكائن المفقود من تعدد المرشحين ومن دورة بوانٍ. افحص النوع والتهيئة الفعالة والمسح والمؤهلات، واختر qualifier أو primary عندما توجد بدائل حقيقية. قد تكشف الدورة مسؤوليات يجب فصلها، لا حاجة لتمكين الدوران عاماً.

اختبر الجذر بأضيق سياق مناسب وتنظيف الموارد المملوكة. لا تخف اتصالاً بعيداً بطيئاً في الباني ليبدو الإنشاء مكتملاً. يوضح الرسم الجيد من ينشئ ويملك ويستبدل ويغلق المتعاون؛ وهذه فائدة الحقن، لا حذف كلمة new من الشيفرة فقط.

الأخطاء الشائعة وإصلاحها

NoSuchBeanDefinitionException

لماذا يحدث؟
لا يحقق مرشح مُدار الاعتماد المطلوب.
كيف تصلحه؟
افحص المسح والاستيراد والملف والنوع.
كيف تتجنب تكراره؟
اختبر جذر التركيب.

NoUniqueBeanDefinitionException

لماذا يحدث؟
تطابقت بدائل دون قاعدة اختيار.
كيف تصلحه؟
استخدم مؤهلاً أو سياسة primary مناسبة.
كيف تتجنب تكراره؟
وثق التنفيذ والاختيار.

BeanCurrentlyInCreationException

لماذا يحدث؟
منعت دورة إنشاء تركيب الاعتماد.
كيف تصلحه؟
افصل المسؤولية أو ضع حداً مراجعاً.
كيف تتجنب تكراره؟
احفظ رسماً بلا دورات قدر الإمكان.

اختبر فهمك

1. لماذا قد يسرب حقل العميل الحالي في خدمة مفردة البيانات؟

اعرض الحل المشروح

تخدم النسخة طلبات متزامنة وقد يكتب أحدهما فوق الآخر. أبق الطلب معاملاً أو محلياً أو بنطاق مقصود، وافرض التفويض مستقلاً؛ فالنطاق لا يعزل المستأجرين تلقائياً.

2. ماذا يثبت نموذج عرض السعر المستقل؟

اعرض الحل المشروح

يثبت الحساب وعلاقة الباني للمدخل المصطنع لا المسح والاختيار والوكيل و HTTP والمعاملة وسلوك الكتالوج الحقيقي. أضف اختبارات محدودة للحدود الأخرى.

أهم ما تعلمته

  • يكشف الباني عقد الاعتماد.
  • يحتاج النطاق والوكيل استدلالاً صريحاً.
  • يختلف دليل المجال من تكامل الحاوية.

المراجع الرسمية