الإعدادات الآمنة من حيث النوع باستخدام @ConfigurationProperties
الإعدادات الآمنة من حيث النوع باستخدام @ConfigurationProperties
في الدرس السابق رأيت كيف تقرأ قيمًا فردية باستخدام @Value. يُجدي هذا الأسلوب مع خاصية أو اثنتين، لكن حين تحتاج ميزة ما إلى عشرات الإعدادات المترابطة — مهلة الانتظار وعدد مرات إعادة المحاولة وعنوان URL الأساسي وبيانات الاعتماد — يُفضي حقن كل منها على حدة إلى كود مُبعثَر يصعب صيانته. يعالج Spring Boot هذا الأمر بـ @ConfigurationProperties: آلية تربط مجموعةً كاملة من الخصائص بفئة Java واحدة قوية النوع.
لماذا نفضّل @ConfigurationProperties على @Value
تأمّل حقن خمسة إعدادات لخادم البريد باستخدام @Value:
كل تعليق توضيحي هش: خطأ مطبعي في المفتاح يجتاز المُترجم لكنه يُطلق استثناءً وقت التنفيذ. لا يوجد إكمال تلقائي في بيئة التطوير عبر المجموعة، ولا تحقق من صحة البيانات، ولا مكان واحد ترى فيه جميع الإعدادات معًا. يُعالج @ConfigurationProperties كل هذه المشكلات.
الإعداد الأساسي
أولًا، أعلن فئة Java عادية مُزيَّنة بـ @ConfigurationProperties وبادئة مشتركة. في Spring Boot 3 تحتاج أيضًا إلى تعليمها بـ @Component أو تسجيلها عبر @EnableConfigurationProperties.
ثم في ملف application.properties (أو application.yml):
timeout-ms وtimeoutMs وTIMEOUT_MS وtimeout_ms باعتبارها اسمًا واحدًا للحقل ذاته. ما عليك سوى التوحيد داخل الملف الواحد؛ إذ يُطبّع الإطار الاسم عند وقت الربط.
استخدام الـ Bean الخاص بالخصائص
احقن الفئة تمامًا كأي bean في Spring:
لأن فئة الخصائص bean حقيقية، تحصل مجانًا على حقن المنشئ وقابلية الاختبار والتنقل عبر بيئة التطوير.
استخدام Records في Java (Spring Boot 3.x)
يدعم Spring Boot 3 الربط مباشرةً بـ Java records. الـ Records غير قابلة للتغيير بطبيعتها، وهو ما يجعلها مثاليةً للإعدادات التي يجب ألا تتغير بعد بدء التشغيل:
الخصائص المتداخلة
يمكن تداخل مجموعات الإعدادات إلى أي عمق. تأمّل خدمة تتحدث إلى API خارجية بسياسة إعادة المحاولة الخاصة بها:
التحقق من الصحة باستخدام Bean Validation
أضف @Validated إلى الفئة واستخدم تعليقات Bean Validation القياسية على الحقول. يُشغّل Spring Boot التحقق عند بدء التشغيل ويفشل بسرعة مع رسالة خطأ واضحة إذا انتُهك قيد ما — بدلًا من الانفجار وقت التنفيذ داخل منطق العمل.
spring-boot-starter-validation في الـ classpath. إن زيّنت الحقول بـ @NotBlank لكنك نسيت إضافة الـ starter، تُتجاهل التعليقات التوضيحية صمتًا عند بدء التشغيل ولا تحصل على أي تحقق. تحقق دائمًا من وجود التبعية.
إكمال تلقائي في بيئة التطوير عبر بيانات وصفية
أضف معالج التعليقات التوضيحية إلى ملف pom.xml ليتمكن IDE من توليد الإكمال التلقائي والتوثيق لبوادئك المخصصة:
يكتب المعالج عند الترجمة ملف META-INF/spring-configuration-metadata.json. تقرأ IntelliJ IDEA وVS Code هذا الملف لتقديم إكمال اسم الخاصية وتوثيق مضمّن داخل application.properties.
@ConfigurationProperties مقابل @Value — دليل القرار
- استخدم
@Valueلخاصية واحدة معزولة — مثل علامة ميزة أو مهلة بسيطة لا تنتمي إلى مجموعة منطقية. - استخدم
@ConfigurationPropertiesحين تشترك خاصيتان أو أكثر في بادئة منطقية، خاصةً إذا حُقنت المجموعة في عدة beans، أو احتاجت قيمًا افتراضية، أو وجب التحقق منها عند بدء التشغيل. - لا تخلط الأسلوبين لنفس المجموعة المفاهيمية — اختر أحدهما والتزم به.
الخلاصة
يُحوّل @ConfigurationProperties فضاء الأسماء المسطّح من مفاتيح وقيم إلى كائن منظَّم آمن النوع. تكسب إكمالًا تلقائيًا في بيئة التطوير وربطًا مرنًا من أي مصدر — ملف خصائص أو YAML أو متغير بيئة أو وسيطة سطر أوامر — وتحققًا عند بدء التشغيل ومكانًا واحدًا لتوثيق كل إعداد تحتاجه الميزة. في الدرس القادم سترى كيف تُتيح Profiles في Spring استبدال مجموعات كاملة من هذه الخصائص بحسب البيئة.