خصائص التطبيق
خصائص التطبيق
كل تطبيق Spring Boot غير بديهي يحتاج إلى سلوك مختلف في بيئات مختلفة: قاعدة بيانات المطوّر على الحاسوب المحمول ليست قاعدة الإنتاج، وخادم البريد التجريبي ليس مُرسِل SMTP الحقيقي، وتسجيل الأحداث على مستوى debug غير ملائم في الإنتاج. يحلّ Spring Boot هذه المشكلة من خلال نظام إعداد موحّد متعدد الطبقات يرتكز على application.properties ونسخته YAML الأخ application.yml. يغطّي هذا الدرس آلية عمل هذا النظام، وما يمكن إعداده، والأنماط التي يعتمدها المطوّرون المحترفون يومًا بعد يوم.
أين يبحث Spring Boot عن الإعداد
يحلّ Spring Boot الإعدادات من مصادر متعددة ويدمجها وفق ترتيب أولوية محدد (الرقم الأعلى يكسب):
- القيم الافتراضية المشفّرة داخل الإعدادات التلقائية (auto-configurations)
- ملف
application.propertiesأوapplication.ymlداخل حزمة JAR (في جذر classpath، أيsrc/main/resources/) - الملفات الخاصة بالـ Profile:
application-{profile}.propertiesعلى classpath - نفس الملفات خارج ملف JAR، في دليل العمل
- متغيرات البيئة في نظام التشغيل
- خصائص نظام JVM (مثال:
-Dserver.port=9090) - وسائط سطر الأوامر (مثال:
--server.port=9090)
src/main/resources/application.properties، وتستطيع العمليات تجاوز أي قيمة وقت التشغيل دون إعادة ترجمة الكود.
Properties مقابل YAML — أيهما تختار
ملفات .properties تستخدم أزواج مفتاح-قيمة مسطّحة:
ملفات .yml (YAML) تعبّر عن المعلومات ذاتها كشجرة متداخلة:
كلاهما متكافئ. YAML أكثر قابلية للقراءة في الهياكل المتداخلة بعمق ويدعم القوائم بشكل نظيف؛ أما .properties فأبسط في البحث (grep) وأكثر ألفةً لمطوّري Java المخضرمين. يدعم Spring Boot 3 الصيغتين. لا تخلطهما في المشروع نفسه — اختر واحدة والتزم بها.
أكثر خصائص Spring Boot استخدامًا
يأتي Spring Boot مع آلاف مفاتيح الإعداد الموثّقة في مرجع Common Application Properties. أكثرها شيوعًا في العمل اليومي:
الخادم
مصدر البيانات و JPA
تسجيل الأحداث
Spring MVC
ربط الخصائص بفئة إعداد مخصصة
توزيع تعليق @Value("${my.key}") في كل أرجاء الكود هش وصعب الاختبار. الأسلوب المحترف في Spring Boot 3 هو @ConfigurationProperties: تعرّف سجلًّا (record) أو فئة Java عادية، تضع عليه التعليق، فيربط Spring تلقائيًا الخصائص ذات البادئة المطابقة من application.properties إلى حقوله — مع تحويل الأنواع والتحقق من الصحة وإكمال تلقائي في IDE.
سجّله في فئة التطبيق الرئيسية (أو أي فئة @Configuration):
حقنه في أي مكان كمعامل مُنشئ عادي (Spring Boot يسجّله تلقائيًا كـ bean):
@ConfigurationProperties على السجل المُنشئ القانوني، ومن ثَمّ يكون كل خاصية مطلوبة إلا إذا زُوِّدت بـ @DefaultValue. النتيجة: كائن إعداد ثابت (immutable) وآمن من القيم الخالية يمكن حقنه واختباره دون محاكاة أي سياق Spring.
الـ Profiles — إعداد خاص بكل بيئة
تتيح لك الـ Profiles الاحتفاظ بمجموعات إعداد منفصلة لـ dev وtest وprod دون تغيير سطر كود Java واحد. أنشئ ملفًا خاصًا بالـ Profile:
application-dev.properties— إعدادات المطوّر (قاعدة بيانات H2 في الذاكرة، تسجيل مسهب)application-prod.properties— إعدادات الإنتاج (PostgreSQL، مستوى تسجيل INFO، بلا طباعة SQL)
تفعيل الـ Profile وقت التشغيل — بلا إعادة ترجمة:
${DB_PASS} داخل application-prod.properties يخبر Spring Boot بقراءة القيمة من متغير بيئة نظام التشغيل باسم DB_PASS. استخدم هذا النمط لجميع كلمات المرور ومفاتيح API والرموز المميزة. الأسرار في ملفات .properties المُودَعة في Git تُشكّل خطرًا أمنيًا بالغ الخطورة.
التعليق @Value — متى لا يزال منطقيًا
يفيد @Value في حقن خاصية واحدة في bean حين تبدو فئة @ConfigurationProperties الكاملة مبالغًا فيها:
اللاحقة :unknown هي القيمة الافتراضية إن كان المفتاح غائبًا. استخدم @Value باعتدال — إنه يتجاوز أمان النوع وأصعب في الاختبار. فضّل @ConfigurationProperties لأي مجموعة من الإعدادات المترابطة.
الخلاصة
نظام إعداد Spring Boot متعدد الطبقات: إعدادات افتراضية داخل JAR، تجاوزات في ملفات خاصة بالـ Profile، وتجاوزات نهائية عبر متغيرات البيئة ووسائط سطر الأوامر. اكتب الإعدادات المشتركة في application.properties، والخاصة بالبيئة في application-{profile}.properties، واربط الإعدادات المترابطة في سجلات @ConfigurationProperties آمنة من حيث النوع. الأسرار لا تعيش في ملفات أبدًا — تأتي من البيئة وقت التشغيل. أتقن هذا النظام ونادرًا ما ستحتاج إلى تغيير الكود المُترجَم لمجرد تعديل سلوك التطبيق.