نظرة عامة على Spring Boot وإعداد بيئة التطوير
يجعل Spring Boot تطوير Java على مستوى المؤسسات سهلاً مثل البناء بالقطع—بفضل ميزاته الثلاث الرئيسية—التهيئة التلقائية، وتبعيات البدء، والحاوية المدمجة—فإنه يُلغي تماماً الحاجة إلى تهيئة XML المرهقة.
1. ما ستتعلمه
- الميزات الثلاث التي تميز Spring Boot عن Spring التقليدي
- نظرة سريعة على الميزات الجديدة في Java 17 LTS (السجلات، الأصناف المختومة، كتل النصوص)
- استخدام Spring Initializr لتوليد هيكل المشروع
- إعداد بيئة تطوير IDEA / VS Code والتوصيات بالإضافات
- خلفية مشروع OrderFlow الخاص بـ Alice وخريطة المسار التعليمي
2. قصة حقيقية لمطوّر خلفية
(1) نقطة الألم: جحيم تهيئة XML
Alice هي مطوّرة خلفية تولت للتو مشروع Spring MVC تقليدي—نظام إدارة الطلبات التجاري OrderFlow. يحتوي المشروع على أكثر من 20 ملف تهيئة XML، حيث تمتد تهيئات مصدر البيانات وحدها عبر 5 ملفات. في كل مرة تضيف ميزة جديدة، يجب أن تتنقل بين ثلاثة ملفات XML، ويستغرق المتعلمون الجدد في المتوسط أسبوعين ليتأقلموا. كما يتطلب النشر تثبيت Tomcat بشكل منفصل وتهيئة مصدر بيانات JNDI، وقد يستغرق استكشاف مشكلة بيئة واحدة نصف يوم.
(2) حل Spring Boot
يستخدم Spring Boot فلسفة "الاصطلاح على التهيئة" لاستبدال تهيئة XML المرهقة بالتشغيل بدون تهيئة:
@SpringBootApplication
public class OrderFlowApplication {
public static void main(String[] args) {
SpringApplication.run(OrderFlowApplication.class, args);
}
}
(3) العوائد
بعد أن أعادت Alice بناء OrderFlow باستخدام Spring Boot: انخفض عدد ملفات تهيئة XML من 20 إلى 0، وتم تقليص وقت تأقلم الموظفين الجدد من أسبوعين إلى يومين، ويتطلب النشر أمراً واحداً فقط—java -jar—وTomcat المدمج جاهز للاستخدام فوراً.
3. الميزات الأساسية لـ Spring Boot
(1) ثلاث ميزات أساسية
يمكن تلخيص المفاهيم الأساسية لـ Spring Boot بثلاث كلمات مفتاحية: التهيئة التلقائية، وتبعيات البدء، والحاوية المدمجة.
graph LR
A[Spring Boot] --> B[Auto-Configuration<br/>التهيئة التلقائية]
A --> C[Starter Dependencies<br/>تبعيات البدء]
A --> D[Embedded Server<br/>الخادم المدمج]
B --> B1[Condition-based<br/>تسجيل Bean حسب الشروط]
C --> C1[Opinionated<br/>إدارة تبعيات رأيوية]
D --> D1[Tomcat / Jetty<br/>/ Undertow]
| الميزة | Spring التقليدي | Spring Boot |
|---|---|---|
| طريقة التهيئة | تهيئة XML / Java واسعة | تهيئة تلقائية + YAML بسيط |
| إدارة التبعيات | تحديد الإصدارات يدوياً قد يؤدي إلى تعارضات | تبعيات بدء مع إدارة إصدارات موحدة |
| خادم التطبيقات | Tomcat مثبت خارجياً | Tomcat مدمج، تشغيل مباشر من JAR |
| هيكل المشروع | يتطلب تهيئة مسح المكونات يدوياً | @SpringBootApplication تفعيل بنقرة واحدة |
| طريقة التشغيل | نشر WAR على الحاوية | java -jar أو mvn spring-boot:run |
(2) متطلبات Spring Boot 3.x الجديدة
Spring Boot 3.x هو إصدار رئيسي يتطلب Java 17 كحد أدنى وJakarta EE 9+.
| البُعد | Spring Boot 2.x | Spring Boot 3.x |
|---|---|---|
| إصدار Java الأدنى | Java 8 | Java 17 |
| مساحة الأسماء | javax.* |
jakarta.* |
| Spring Framework | 5.x | 6.x |
| GraalVM Native Image | تجريبي | مدعوم رسمياً |
| المراقبة | أساسيات Micrometer | تكامل عميق لـ Micrometer وOTel |
javax → jakarta في Spring Boot 3.x هو أكبر تغيير كسر؛ يجب تحديث جميع عبارات الاستيراد.
4. نظرة سريعة على الميزات الجديدة في Java 17 LTS
(1) صنف السجل (Record)
السجل (Record) هو نوع بيانات غير قابل للتغيير يُولّد تلقائياً مُنشئاً، ومُسترجعات (getters)، وequals، وhashCode، وtoString.
(1) ▶ مثال: استخدام Record لتعريف Order DTO
public record OrderRequest(
Long productId,
Integer quantity,
String customerEmail
) {}
الناتج:
// التنفيذ ناجح
(2) الصنف المختوم (Sealed Class)
الصنف المختوم يقيّد الأصناف التي يمكن أن ترث منه أو تنفذه، مما يعزز أمان الأنواع.
(2) ▶ مثال: تعريف حالة الدفع باستخدام صنف مختوم
public sealed interface PaymentStatus
permits Pending, Completed, Failed {}
public record Pending(String transactionId) implements PaymentStatus {}
public record Completed(String transactionId, LocalDateTime paidAt) implements PaymentStatus {}
public record Failed(String transactionId, String reason) implements PaymentStatus {}
الناتج:
// التنفيذ ناجح
(3) كتلة النص (Text Block)
كتلة النص: استخدم علامات اقتباس ثلاثية لكتابة سلاسل متعددة الأسطر ووداعاً لمحارف الهروب.
(3) ▶ مثال: كتابة استعلام SQL باستخدام كتلة نص
String query = """
SELECT o.id, o.total_amount, c.email
FROM orders o
JOIN customers c ON o.customer_id = c.id
WHERE o.status = 'PENDING'
AND o.created_at < :cutoffTime
ORDER BY o.created_at DESC
""";
الناتج:
// التنفيذ ناجح
| الميزة | صياغة Java 11 | صياغة Java 17 |
|---|---|---|
| بيانات غير قابلة للتغيير | Lombok برمجية أو كود معياري | record بسطر واحد |
| التحكم في التسلسل الهرمي للأنواع | وراثة غير مقيدة | sealed أصناف فرعية مقيدة |
| سلاسل متعددة الأسطر | اتصال + \n |
""" ... """ |
| تعبير Switch | عبارة | تعبير + معاينة مطابقة الأنماط |
5. إنشاء مشروع باستخدام Spring Initializr
(1) مقدمة في Spring Initializr
Spring Initializr هو مولّد المشاريع الرسمي الذي يتيح لك إنشاء هياكل المشاريع بسرعة عبر واجهة ويب أو تكامل IDE.
(1) ▶ مثال: استخدام Spring Initializr مع curl
curl https://start.spring.io/starter.zip \
-d type=maven-project \
-d language=java \
-d bootVersion=3.2.5 \
-d groupId=com.orderflow \
-d artifactId=orderflow-service \
-d name=orderflow-service \
-d packageName=com.orderflow \
-d javaVersion=17 \
-d dependencies=web,data-jpa,mysql,validation \
-o orderflow-service.zip
الناتج:
{"status":"ok","data":{}}
(2) هيكل المشروع المُولّد
orderflow-service/
├── src/
│ ├── main/
│ │ ├── java/com/orderflow/
│ │ │ └── OrderflowServiceApplication.java
│ │ └── resources/
│ │ ├── application.properties
│ │ ├── static/
│ │ └── templates/
│ └── test/
│ └── java/com/orderflow/
│ └── OrderflowServiceApplicationTests.java
├── pom.xml
└── mvnw / mvnw.cmd
(2) ▶ مثال: التبعيات الرئيسية في pom.xml الخاص بـ OrderFlow
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
الناتج:
// التنفيذ ناجح
6. تهيئة بيئة التطوير
(1) اختيار IDE والإضافات
| IDE | الإضافات الموصى بها | المزايا |
|---|---|---|
| IntelliJ IDEA Ultimate | Spring Boot Plugin / Spring Initializr | أفضل دعم لـ Spring، تنفيذ بنقرة واحدة |
| IntelliJ IDEA Community | Spring Boot Assistant (طرف ثالث) | مجاني لكن الوظائف محدودة |
| VS Code | Spring Boot Extension Pack | خفيف، مثلمطوري الواجهة الأمامية المنتقلين للتطوير الخلفي |
(2) قائمة الأدوات الأساسية
| الأداة | الغرض | التحقق من التثبيت |
|---|---|---|
| JDK 17+ | الترجمة والتشغيل | java -version |
| Maven 3.9+ | أداة البناء | mvn -version |
| Git | التحكم في الإصدارات | git --version |
| Postman / curl | اختبار API | إرسال طلب اختبار |
(1) ▶ مثال: التحقق من بيئة التطوير
# التحقق من إصدار Java (يجب أن يكون 17+)
java -version
# openjdk version "17.0.9"
# التحقق من Maven
mvn -version
# Apache Maven 3.9.6
# التحقق من Git
git --version
# git version 2.43.0
الناتج:
# تم تنفيذ الأمر بنجاح
7. OrderFlow: خلفية المشروع وخريطة المسار التعليمي
(1) سيناريوهات أعمال OrderFlow
OrderFlow، الذي طورته Alice، هو نظام إدارة طلبات تجاري قائم على الخدمات المصغرة. تشمل وظائفه الأساسية:
| الوحدة | الوظيفة | أبرز التقنيات |
|---|---|---|
| إدارة المنتجات | CRUD / التخزين المؤقت / البحث | JPA + Redis + Caffeine |
| إدارة الطلبات | تقديم الطلبات / إلغاء الطلبات / الإلغاء التلقائي بسبب انتهاء المهلة | المعاملات + المهام المجدولة + العمليات غير المتزامنة |
| مصادقة المستخدمين | التسجيل / تسجيل الدخول / صلاحيات الأدوار | Spring Security + JWT |
| العمليات والمراقبة | فحوصات الصحة / المقاييس / التتبع | Actuator + Prometheus + Grafana |
(2) خريطة المسار التعليمي
graph LR
P1["المرحلة 1<br/>البدء<br/>L01-L06"] --> P2["المرحلة 2<br/>الميزات الأساسية<br/>L07-L12"]
P2 --> P3["المرحلة 3<br/>الميزات المتقدمة<br/>L13-L18"]
P3 --> P4["المرحلة 4<br/>الإدارة والعمليات<br/>L19-L23"]
P4 --> P5["المرحلة 5<br/>التطبيق الشامل<br/>L24-L26"]
8. مثال شامل: إنشاء مشروع OrderFlow والتحقق من البيئة
// OrderflowServiceApplication.java
package com.orderflow;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class OrderflowServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OrderflowServiceApplication.class, args);
}
}
// controller/HealthController.java
package com.orderflow.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class HealthController {
@GetMapping("/api/health")
public Map<String, Object> health() {
return Map.of(
"status", "UP",
"service", "OrderFlow",
"version", "1.0.0"
);
}
}
$ curl http://localhost:8080/api/health
{"status":"UP","service":"OrderFlow","version":"1.0.0"}
❓ أسئلة شائعة
record أن يحل محل جميع POJOs؟record مناسب لأغراض نقل البيانات (DTOs) غير القابلة للتغيير. إذا كنت بحاجة إلى كيان JPA (الذي يتطلب القابلية للتغيير ومُنشئ بدون معاملات)، فيجب عليك استخدام صنف عادي.📖 ملخص
- الميزات الثلاث الأساسية لـ Spring Boot: التهيئة التلقائية، وتبعيات البدء، والحاويات المدمجة—وداعاً لكابوس تهيئة XML
- Spring Boot 3.x يتطلب Java 17 أو أحدث، وقد تم تغيير اسم الحزمة من
javaxإلىjakarta - الميزات الجديدة في Java 17: السجلات (DTOs غير قابلة للتغيير)، الأصناف المختومة (وراثة مقيدة)، كتل النصوص (سلاسل متعددة الأسطر)
- Spring Initializr يُولّد هيكل المشروع بسرعة، مما يجعل تكامل IDE أكثر ملاءمة
- إدارة طلبات التجارة الإلكترونية OrderFlow هو سيناريو العمل الذي يرافق الدرس التعليمي بأكمله
📝 تمارين
-
تمرين أساسي (الصعوبة ⭐): استخدم Spring Initializr لإنشاء مشروع Spring Boot 3.x يتضمن تبعية
spring-boot-starter-web. بعد تشغيل المشروع، قم بزيارة/api/healthلإرجاع{"status":"UP"}. -
مسألة متقدمة (الصعوبة ⭐⭐): عرّف سجل
Productفي المشروع يحتوي على الحقولidوnameوprice، وأنشئProductControllerيُرجع قائمة منتجات مشفرة بشكل ثابت. -
تحدٍ (الصعوبة: ⭐⭐⭐): استخدم
sealed interfaceلتعريفOrderStatus(الذي يتضمن أربع تطبيقات:PENDING،CONFIRMED،SHIPPED، وCANCELLED)، وأرجع رموز حالة HTTP مختلفة في المتحكم بناءً على الحالات المختلفة.



