أساليب الإعداد: Java مقابل التعليقات التوضيحية مقابل XML
أساليب الإعداد: Java مقابل التعليقات التوضيحية مقابل XML
يمنحك Spring ثلاثة أساليب متمايزة لإخبار حاوية IoC بالـ beans التي تنشئها وكيفية ربطها معًا. لكل أسلوب مبرراته التي أوجدته، ولا تزال الأساليب الثلاثة حاضرة في قواعد الكود الإنتاجية اليوم. فهمها — وامتلاك القدرة على اختيار الأنسب منها — هو الفرق بين المطوّر الذي يستخدم Spring ومن يفهمه فعلًا.
نظرة عامة على الأساليب الثلاثة
- إعداد XML — الأصل (Spring 1.x، نحو 2003). تُعلَن الـ beans وتبعياتها في ملف
applicationContext.xml. - الإعداد بالتعليقات التوضيحية — أُدرج في Spring 2.5 (2007). تُقيم البيانات الوصفية داخل الفئة نفسها عبر تعليقات توضيحية كـ
@Componentو@Autowired. - الإعداد بلغة Java — رُسِّخ في Spring 3.0 (2009). فئة Java عادية مُزيَّنة بـ
@Configurationتعمل كمصنع للـ beans.
تجمع المشاريع الحديثة في معظمها بين الإعداد بالتعليقات التوضيحية والإعداد ببصمة Java، غير أنك ستصادف الأساليب الثلاثة عند قراءة الكود القديم أو مكتبات المصدر المفتوح.
الأسلوب الأول: إعداد XML
قبل وجود التعليقات التوضيحية، كان المطوّرون يصفون كل bean وتبعياتها في ملف XML. كانت Spring تقرأ الملف وتُنشئ الـ beans وتربطها معًا.
تحميله في وقت التشغيل:
متى لا تزال ترى XML: التطبيقات المؤسسية القديمة (كود ما قبل 2010)، وخطوط أنابيب Spring Integration/Spring Batch التي لم تُهاجَر بعد، والمكتبات الخارجية التي تشحن ملف إعداد افتراضيًا تستورده.
الأسلوب الثاني: الإعداد بالتعليقات التوضيحية
ينقل هذا الأسلوب بيانات الربط الوصفية إلى داخل الفئات نفسها. تُعلّم الفئة كـ bean بتعليق توضيحي نمطي (@Component أو @Service أو @Repository أو @Controller) وتطلب من Spring اكتشافها بالمسح الآلي.
لتفعيل المسح وجِّه Spring نحو الحزمة المناسبة:
final (اللاتغيّرية)، ويجعل الفئة قابلة للاختبار بسهولة دون حاوية Spring — يكفي new UserService(mockRepo). أما الحقن عبر الحقل مباشرةً بـ @Autowired فيخفي التبعيات ويستلزم الانعكاس للاختبار.
التعليقات التوضيحية النمطية تحمل معنىً يتجاوز الاكتشاف:
@Repository— تُعلّم طبقة الوصول للبيانات (DAO)؛ تترجم Spring استثناءات الاستمرارية إلى هيكليةDataAccessExceptionالموحّدة.@Service— تُعلّم منطق الأعمال؛ لا سلوك إضافي اليوم لكنها تُعبّر عن النية وهي الهدف الاصطلاحي لوكلاء المعاملات.@Controller/@RestController— تُعلّم متحكمات MVC؛ يربط Spring MVC توابع معالجة الطلبات على هذه الـ beans.@Component— التعليق العام الشامل لكل ما لا يندرج ضمن الثلاثة أعلاه.
الأسلوب الثالث: الإعداد ببصمة Java
يستبدل الإعداد ببصمة Java ملف XML بفئة Java. تُزيّن الفئة بـ @Configuration وتُعلن كل bean كتابع مُزيَّن بـ @Bean. تستدعي Spring هذه التوابع وتدير الكائنات المُعادة كـ beans.
@Bean: تُصنع فئات @Configuration من فئات فرعية بواسطة CGLIB عند بدء التشغيل. تُجاوز الفئة المُنشأة كل تابع @Bean للتحقق من الحاوية أولًا؛ إن كانت الـ bean موجودةً تُعيدها بدلًا من استدعاء كود المصنع مجددًا. لهذا يمنحك استدعاء userRepository() داخل userService() المُفرد لا نسخة جديدة. لذلك لا يجوز أن تكون الفئات المُزيَّنة بـ @Configuration من نوع final.
يمنحك إعداد Java دعم IDE الكامل: عند إعادة تسمية فئة يُبلّغ المترجم فورًا عن المراجع المكسورة. يمكنك أيضًا استخدام شروط وحلقات أو أي منطق Java داخل تابع @Bean — وهو أمر مستحيل في XML.
دمج الأساليب — الواقع العملي
الأساليب قابلة للتركيب. يمكن لفئة @Configuration استيراد ملف XML، ويمكن لملف XML تفعيل مسح التعليقات التوضيحية. إعداد احترافي شائع:
@ComponentScan لأنها تحمل @Service ثم أضفت تابع @Bean لها في فئة @Configuration، نشأ تعارض. Spring 6 أكثر صرامةً في هذا الشأن وقد يُطلق استثناءً بدلًا من اختيار أحدهما بصمت.
أي أسلوب تختار اليوم
- المشاريع الجديدة: التعليقات التوضيحية النمطية (
@Service،@Repository) لفئات المجال الخاصة بك، مع@Configuration+@Beanلـ beans البنية التحتية (مصادر البيانات، عملاء HTTP، محوّلات الطرف الثالث). هذا المزيج ما تستخدمه Spring Boot تحت الغطاء. - XML: تجنبه في الكود الجديد. اقرأه وصنه في الأنظمة القديمة، وانتهز الفرصة لترحيله إلى إعداد Java.
- إعداد Java الخالص (بلا مسح): مفيد حين تريد تحكمًا صريحًا وقابلًا للتدقيق في كل bean — شائع في كود المكتبات والفرق التي تتحاشى الاكتشاف السحري.
الخلاصة
يقدّم Spring إعداد XML والتعليقات التوضيحية وإعداد Java — وكلها مدعومة في آنٍ واحد. XML مفصَّل لكن صريح. التعليقات التوضيحية موجزة لكنها تشتّت البيانات الوصفية عبر الفئات. يمنحك إعداد Java سلامة النوع المترجمة وتعبيرية الكود الحقيقي. تستند تطبيقات Spring الاحترافية اليوم إلى التعليقات التوضيحية النمطية لكود المجال وإعداد Java للبنية التحتية، تاركةً الإعداد التلقائي لـ Spring Boot يتولى الباقي. فهم الأساليب الثلاثة يعني قدرتك على قراءة أي قاعدة كود Spring واتخاذ قرارات مستنيرة فيما تكتبه لاحقًا.