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

انقلاب التحكم في إطار الربيع

تم النشر بتاريخ 2024-11-06
تصفح:651

Inversion of Control in Spring Framework

يعد انعكاس التحكم (IoC) وحقن التبعية (DI) مفهومين أساسيين في Spring Framework. تقليديًا، تكون الكائنات مسؤولة عن إنشاء وإدارة تبعياتها الخاصة. ومع ذلك، تقلب IoC هذه المسؤولية عن طريق تسليم التحكم في إنشاء الكائنات وإدارة التبعية إلى إطار عمل مثل Spring.

يوفر هذا التحول العديد من المزايا:

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

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

فهم حقن التبعية

حقن التبعيات (DI) هو أسلوب يقوم فيه الإطار بحقن التبعيات في كائن بدلاً من الكائن الذي ينشئ التبعيات نفسها. هناك أنواع مختلفة من DI في الربيع:

  • حقن المنشئ: يتم توفير التبعيات من خلال مُنشئ الفصل.
  • حقن الضبط: يتم حقن التبعيات من خلال طرق الضبط.
  • حقن الحقل: يتم تعيين التبعيات مباشرة إلى الحقول باستخدام التعليقات التوضيحية.

على سبيل المثال، في فئة خدمة بسيطة، قد ترى شيئًا مثل هذا:

@Service
public class OrderService {

    private final PaymentService paymentService;

    @Autowired
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }

    public void processOrder(Order order) {
        paymentService.processPayment(order.getPaymentDetails());
    }
}

هنا، يتم إدخال PaymentService في OrderService عبر حقن المنشئ، وهو المفضل بشكل عام لتبعياته الواضحة وسهولة الاختبار.

حاوية IoC: BeanFactory مقابل ApplicationContext

يوفر Spring حاوية IoC المسؤولة عن إدارة دورة حياة الحبوب (الكائنات التي يديرها Spring). الواجهة الأساسية لهذه الحاوية هي BeanFactory. ومع ذلك، تستخدم معظم التطبيقات ApplicationContext، الذي يمتد إلى BeanFactory ويقدم ميزات إضافية.

BeanFactory

  • حاوية IoC الأساسية: توفر الوظائف الأساسية لإنشاء الحبوب وإدارتها.
  • التهيئة البطيئة: يتم إنشاء الفاصوليا عند طلبها لأول مرة.

سياق التطبيق

  • حاوية IoC المتقدمة: بالإضافة إلى الميزات الأساسية لـ BeanFactory، فهي توفر:
    • دعم التدويل (i18n)
    • نشر الأحداث والتعامل معها
    • التعامل مع الطلبات غير المتزامنة
    • التكامل مع البرمجة الموجهة نحو الجوانب (AOP)
  • التهيئة السريعة: يمكن إنشاء مثيل للفاصوليا عند بدء تشغيل التطبيق، مما يجعلها متاحة للاستخدام الفوري.

مثال:

// Getting a bean from the ApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = context.getBean(MyBean.class);

في هذا المثال، يتم استخدام ApplicationContext لاسترداد حبة. إذا كنت تستخدم BeanFactory أساسيًا، فإنه سيوفر وظائف مماثلة ولكن بدون المزايا الإضافية لـ ApplicationContext.

الوصول إلى سياق التطبيق

هناك طريقتان شائعتان للوصول إلى سياق التطبيق الحالي:

  1. Autowired: أدخل سياق التطبيق مباشرة في المكون الخاص بك.

    @Autowired
    private ApplicationContext applicationContext;
    
  2. ApplicationContextAware: قم بتنفيذ واجهة ApplicationContextAware، والتي تسمح لك باسترداد ApplicationContext حسب الحاجة.

    public class MyBean implements ApplicationContextAware {
        private ApplicationContext applicationContext;
    
        @Override
        public void setApplicationContext(ApplicationContext context) throws BeansException {
            this.applicationContext = context;
        }
    }
    

دورة حياة تطبيق الربيع

عندما يبدأ تطبيق Spring، يتم تنفيذ سلسلة من الخطوات:

  1. متغيرات وخصائص بيئة المعالجة: يتم إنشاء كائن البيئة، مع دمج الإعدادات من application.properties أو application.yml.

  2. إنشاء سياق التطبيق : يتم تحديد نوع سياق التطبيق المناسب وإنشاء مثيل له. على سبيل المثال، قد يستخدم تطبيق Spring Boot AnnotationConfigServletWebServerApplicationContext للتكوينات المستندة إلى Java.

  3. تحميل تعريفات الفول : يقوم الربيع بتحميل تعريفات الفول من مصادر متعددة، مثل الفئات المشروحة، أو فئات @Configuration، أو ملفات XML. يتضمن كل تعريف للفاصوليا معلومات حول نوع الحبة ونطاقها وتبعياتها وعمليات الاسترجاعات الخاصة بدورة الحياة.

  4. Processing BeanFactoryPostProcessors: تقوم هذه المعالجات بتعديل تعريفات الفول قبل إنشاء الفول الفعلي.

  5. تحليل التبعيات وإنشاء الفول : يقوم ApplicationContext بحل التبعيات وإنشاء الحبوب. إذا كانت حبة الفول لديها تبعيات على حبوب أخرى، فسيتم إنشاء هذه التبعيات أولاً.

نطاقات الفول في الربيع

يدعم Spring نطاقات الفول المختلفة، والتي تحدد دورة حياة الحبة ورؤيتها داخل الحاوية:

  • Singleton (افتراضي): يتم إنشاء مثيل واحد للفاصوليا لسياق التطبيق بأكمله.
  • النموذج الأولي: يتم إنشاء مثيل جديد في كل مرة يتم فيها طلب الحبة.
  • الطلب: يتم إنشاء نسخة فول جديدة لكل طلب HTTP (تطبيقات الويب).
  • الجلسة: يتم إنشاء مثيل فول جديد لكل جلسة HTTP (تطبيقات الويب).

مثال:

@Bean
@Scope("prototype")
public MyPrototypeBean myPrototypeBean() {
    return new MyPrototypeBean();
}

في هذا المثال، يتم إنشاء مثيل MyPrototypeBean جديد في كل مرة يتم طلبه من الحاوية.

كائنات الوكيل في نطاقات الفول

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

مثال مع الوكلاء:

@Component
@Scope(value = "singleton")
public class SingletonBean {

    @Autowired
    @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS)
    private PrototypeBean prototypeBean;

    public void showMessage() {
        System.out.println(prototypeBean.getMessage());
    }
}

هنا، يضمن ScopedProxyMode.TARGET_CLASS إرجاع مثيل PrototypeBean الجديد في كل مرة يتم فيها استدعاء getMessage().

الفرق بين إطار الربيع والتمهيد الربيعي

يعد Spring Boot امتدادًا لـ Spring Framework الذي يعمل على تبسيط عملية إعداد وتطوير تطبيقات Spring الجديدة. ويقدم:

  • خوادم التطبيقات المضمنة: يمكنك تشغيل تطبيقات Spring بسهولة كتطبيقات مستقلة مع Tomcat أو Jetty أو Undertow المضمنة.
  • التكوين التلقائي: يقوم تلقائيًا بتكوين الفاصوليا بناءً على مسار الفصل والإعدادات الأخرى.
  • التغليف المبسط: حزم التطبيقات على شكل ملفات JAR أو WAR قابلة للتنفيذ.
  • المراقبة المتكاملة والفحوصات الصحية: نقاط نهاية مدمجة لمراقبة صحة التطبيق وحالته.

التكوين التلقائي في Spring Boot

يعد التكوين التلقائي ميزة قوية في Spring Boot تقوم بتكوين العديد من الأشياء لك بناءً على التبعيات في مسار الفصل الدراسي الخاص بك. يتم التحكم في ذلك من خلال التعليقات التوضيحية الشرطية مثل:

  • @ConditionalOnClass
  • @ConditionalOnMissingClass
  • @ConditionalOnBean
  • @ConditionalOnMissingBean

مثال:

على سبيل المثال، إذا كان لديك Jackson في مسار الفصل الدراسي الخاص بك، فسيقوم Spring Boot تلقائيًا بتكوين ObjectMapper لتسلسل JSON:

@Configuration
@ConditionalOnClass(ObjectMapper.class)
public class JacksonAutoConfiguration {
    // Configuration details...
}

إذا كان ObjectMapper موجودًا، فسيتم تطبيق هذا التكوين تلقائيًا. وإلا فسيتم تخطيه.

عرض التكوينات التلقائية النشطة

يمكنك تسجيل التكوينات التلقائية النشطة أثناء بدء التشغيل عن طريق إضافة ما يلي إلى خصائص التطبيق الخاص بك:

logging.level.org.springframework.boot.autoconfigure=DEBUG

سيؤدي هذا إلى إنشاء تقرير مفصل يوضح التكوينات التي تم تطبيقها والتي لم يتم تطبيقها، مما يساعدك على استكشاف أخطاء تكوين التطبيق وإصلاحها أو فهمها.

خاتمة

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

بيان الافراج تم نشر هذه المقالة على: https://dev.to/be11amer/inversion-of-control-in-spring-framework-4mc0?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3