إنشاء مشروع Spring Boot
إنشاء مشروع Spring Boot
كل تطبيق Spring Boot ينطلق من ثلاثة عناصر: هيكل مشروع مُوَلَّد عبر Spring Initializr، وتخطيط دليل محدد بدقة، وفئة رئيسية وحيدة تحمل التعليقات التوضيحية المطلوبة وتعمل على تمهيد الإطار بأكمله. يُشرّح هذا الدرس العناصر الثلاثة، لتفهم ليس فقط ما يوجد، بل لماذا يوجد وما الذي يمكنك تعديله بأمان.
Spring Initializr — مولّد المشاريع
start.spring.io هو مولّد المشاريع الرسمي المستند إلى المتصفح والذي يُشرف عليه فريق Spring. يُنتج أرشيف مشروع جاهز للاستيراد في ثوانٍ. يتوفر الجيل نفسه داخل IntelliJ IDEA (File → New → Project → Spring Initializr) وفي VS Code عبر حزمة Spring Boot Extension Pack. كلا الخيارين يستدعيان واجهة REST نفسها في الخلفية.
الخيارات الأساسية التي تحددها في النموذج:
- نوع المشروع: Maven أو Gradle (بـ DSL بصيغة Groovy أو Kotlin). Maven هو الخيار الأكثر أمانًا للفرق؛ أما Gradle فأسرع في بناء المشاريع الكبيرة.
- اللغة: Java (هذا الكورس)، أو Kotlin، أو Groovy.
- إصدار Spring Boot: اختر دائمًا أحدث إصدار GA (متاح للعموم). في Spring Boot 3.x، الحد الأدنى لإصدار Java هو 17.
- Group / Artifact / Name / Description: إحداثيات Maven القياسية. استخدم مجموعة بتنسيق النطاق العكسي مثل
com.acmeواسم artifact بأحرف صغيرة وشرطات مثلbookstore-api. - التغليف: Jar لمعظم التطبيقات (يُجمَّع الخادم المدمج بداخله). اختر War فقط حين يتعين عليك النشر على حاوية servlet خارجية.
- إصدار Java: طابق JDK الخاص بك. الإصدار 21 (LTS) هو الخيار الأفضل حاليًا.
- التبعيات (الـ Starters): أضف ما تحتاجه الآن؛ يمكنك دائمًا إضافة المزيد إلى
pom.xmlلاحقًا.
انقر Generate، فك ضغط الأرشيف، وافتحه في بيئة التطوير. المشروع يُترجَم ويعمل فور الإنشاء — لا شيء يحتاج إعدادًا قبل أول ./mvnw spring-boot:run.
تخطيط المشروع القياسي
يُنتج Spring Initializr مشروع Maven أو Gradle يتبع اتفاقية دليل Java القياسية. مشروع تم توليده حديثًا يبدو هكذا:
بعض النقاط الجديرة بالملاحظة:
- Maven Wrapper (
mvnw) يُثبّت إصدارًا محددًا من Maven للمشروع، فيستخدم كل مطور وكل خادم CI أداة البناء ذاتها بالضبط دون الحاجة إلى تثبيت محلي. شغّله بـ./mvnw spring-boot:runعلى macOS/Linux أوmvnw.cmd spring-boot:runعلى Windows. src/main/resources/static/يُخدَّم مباشرةً بواسطة الخادم المدمج. ملف فيstatic/favicon.icoيكون متاحًا عبرhttp://localhost:8080/favicon.ico.src/main/resources/templates/هو الموقع الافتراضي لقوالب العرض من جانب الخادم. يُهم فقط إذا أضفت starter لمحرك قوالب.- شجرة مصادر الاختبار تعكس شجرة المصادر الرئيسية.
BookstoreApiApplicationTestsالمُوَلَّد يحمّل سياق Spring الكامل — إنه اختبار دخان تكاملي وليس اختبار وحدة.
@Component أو @Service أو @Repository أو @Controller إلخ) من الحزمة التي تحتوي على الفئة الرئيسية وجميع الحزم الفرعية. ضع الفئة الرئيسية في جذر الحزمة الأساسية — ليس داخل حزمة فرعية — لتغطية المسح لكل شيء تلقائيًا.
ملف pom.xml — ما يولّده Initializr
يحتوي pom.xml المُوَلَّد على إضافتين هيكليتين فوق مشروع Maven العادي: يرث من spring-boot-starter-parent ويتضمن Spring Boot Maven plugin.
يستورد spring-boot-starter-parent قائمة مواد Spring Boot BOM التي تحدد إصدارات مُدارة لمئات المكتبات. لهذا لا تحتاج مدخلات <dependency> إلى وسم <version> — تُوفّره قائمة BOM تلقائيًا بإصدار متوافق ومختبر. يُضيف Maven plugin هدف spring-boot:run ويُعيد حزم JAR إلى fat JAR تنفيذي يجمع كل التبعيات بداخله لتتمكن من نشره بأمر java -jar واحد.
الفئة الرئيسية — @SpringBootApplication
يولّد Spring Initializr فئة رئيسية واحدة بالضبط. إنها صغيرة لكنها تحمل معنى كبيرًا:
@SpringBootApplication هو تعليق توضيحي مُركَّب — اختصار لثلاثة تعليقات مُطبَّقة معًا:
@SpringBootConfiguration— يُعلّم هذه الفئة كمصدر إعداد (يعادل@Configurationفي Spring). يمكنك تعريف دوال@Beanمباشرةً هنا، رغم أن معظم الفرق تحتفظ بالفئة الرئيسية نظيفة وتضع الـ beans في فئات@Configurationمخصصة.@EnableAutoConfiguration— يأمر Spring Boot بفحص الـ classpath وتفعيل الإعدادات الافتراضية المنطقية لكل ما يجده. إذا كانspring-boot-starter-webموجودًا، يُهيئ Tomcat مدمجًا وDispatcherServlet. يُغطّى الـ auto-configuration بعمق في الدرس الرابع.@ComponentScan— يمسح الحزمة الحالية (والحزم الفرعية) بحثًا عن المكونات التي يديرها Spring. هذه الآلية هي ما يكتشف فئات@Serviceو@Repositoryو@RestController.
تؤدي SpringApplication.run(BookstoreApiApplication.class, args) عملية الإقلاع الفعلية:
- تُنشئ
ApplicationContextمناسبة للبيئة المكتشفة (servlet أو reactive أو لا شيء). - تُسجّل جميع الـ beans المكتشفة وتُطبّق الـ auto-configuration.
- تُشغّل الخادم المدمج (إذا كان web starter موجودًا).
- تُطلق
ApplicationReadyEventحتى يتمكن المستمعون والـ runners من تنفيذ المنطق اللاحق للإقلاع.
com.acme.bookstoreapi.config، سيمسح @ComponentScan فقط com.acme.bookstoreapi.config وما ينبع منها — مفوّتًا الـ beans في الحزم المجاورة. إما أبق الفئة الرئيسية في الجذر، أو اضبط صراحةً @SpringBootApplication(scanBasePackages = "com.acme.bookstoreapi").
تشغيل التطبيق
تمتلك ثلاث طرق متكافئة لتشغيل التطبيق خلال التطوير:
- Maven Wrapper:
./mvnw spring-boot:run— يُترجم ويُشغّل بأمر واحد، مريح للتكرار السريع. - تهيئة تشغيل بيئة التطوير: انقر بزر الفأرة الأيمن على الفئة الرئيسية ثم Run. يكتشف كل من IntelliJ IDEA وVS Code تطبيقات Spring Boot ويُنشئان تهيئات تشغيل جاهزة تلقائيًا.
- Fat JAR:
./mvnw packageثمjava -jar target/bookstore-api-0.0.1-SNAPSHOT.jar— هذا هو نموذج النشر في الإنتاج.
مع وجود spring-boot-starter-web على الـ classpath ستظهر مخرجات مثل التالي ويستمع التطبيق على المنفذ 8080:
الخلاصة
يُولّد Spring Initializr مشروع Maven أو Gradle بتخطيط اتفاقي ثابت. تمتلك الفئة الرئيسية المُزيَّنة بـ @SpringBootApplication مسح المكونات وتفعيل الـ auto-configuration ونقطة الدخول للإقلاع — كل ذلك في مكان واحد. إنّ فهم هذا السقالة — والخيارات المبنية فيها — يعني قدرتك على تعديله بشكل مدروس لا بأسلوب التجربة والخطأ. في الدرس القادم ستكتشف كيف تُبقي الـ starters وقائمة BOM إدارة التبعيات تحت السيطرة.