جلسه شماره 116رایگان

Spring Project Structure | ساختار پروژه اسپرینگ

00:22:06

توضیحات جلسه

🎥 این ویدیو قسمت صد و پنجم از بوت‌کمپ رایگان جاوا و چهارمین ویدیو از پلی‌لیست آموزش اسپرینگ است. 📚 در این جلسه، با الهام از مباحث کتاب Spring in Action، به سراغ کالبدشکافی ساختار یک پروژه اسپرینگی می‌رویم. پس از ساخت پروژه توسط Spring Initializr، حالا نوبت آن است که بدانیم درون این پروژه چه خبر است و هر بخش چه وظیفه‌ای دارد. در این ویدیو فایل‌های پیکربندی و ساختار اصلی را بررسی می‌کنیم تا درک عمیقی از نحوه مدیریت وابستگی‌ها و اجرای اپلیکیشن پیدا کنید. در این جلسه یاد می‌گیریم: 🔍 بررسی کلی ساختار فایل‌ها و پوشه‌های پروژه اسپرینگ 📦 اهمیت فایل POM و نحوه مدیریت Parent tag در آن ⚙️ مفهوم Dependency و وابستگی‌های پروژه 🧩 درک عمیق مفهوم Starter در اسپرینگ بوت و نقش آن 🛠️ نقش Spring Boot Plugin در مدیریت بیلد پروژه 🚀 بررسی نحوه Bootstrapping یا همان اجرای اولیه اپلیکیشن اگر قصد دارید به صورت اصولی و حرفه‌ای با اسپرینگ کار کنید، شناخت دقیق این ساختار یکی از مهم‌ترین پیش‌نیازهاست. 📌 یوتیوب: youtube.com/@farzadafi 📌 آپارات: aparat.com/farzadafi 📌 وب سایت: https://farzadafi.ir 💬 گروه پرسش و پاسخ تلگرام: @programmingByFarzadAfi 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi هر سوالی داشته باشید می‌توانید در گروه بپرسید تا من یا مربی‌های گروه کمکتان کنیم :) 🎯 بوت‌کمپ رایگان جاوا – آموزش کاملاً پروژه‌محور برای یادگیری عمیق جاوا و ورود به بازار کار.

جزوه و مستندات

مفاهیم کلیدی

  • Project Structure

استاندارد ساختار پوشه‌بندی در پروژه‌های Maven و Gradle است که در آن کدهای اصلی برنامه در مسیر src/main/java، تست‌ها در src/test/java و فایل‌های غیرجاوا در src/main/resources سازمان‌دهی می‌شوند.

  • Maven Wrapper

اسکریپت‌های اجرایی شامل mvnw برای لینوکس/مک و mvnw.cmd برای ویندوز هستند که امکان بیلد و اجرای پروژه را بدون نیاز به نصب مستقل Maven روی سیستم فراهم می‌کنند.

  • pom.xml

فایل اصلی پیکربندی بیلد Maven با فرمت XML است که تنظیمات ساخت پروژه، پلاگین‌ها و لیست وابستگی‌ها را مدیریت می‌کند.

  • spring-boot-starter-parent

یک parent POM اختصاصی در Spring Boot است که مدیریت خودکار نسخه‌ها (Dependency Management) را برای کتابخانه‌های پرکاربرد بر عهده دارد و مانع تداخل نسخه وابستگی‌ها می‌شود.

  • Starter Dependencies

وابستگی‌های جامعی با پیشوند spring-boot-starter هستند که خودشان کدی ندارند، اما تمام کتابخانه‌های مورد نیاز یک قابلیت خاص را به‌صورت بازگشتی (transitive) اضافه می‌کنند.

  • Spring Boot Maven Plugin

پلاگینی در pom.xml که قابلیت‌هایی مانند اجرای برنامه از طریق Maven، ساخت fat JAR اجرایی شامل تمام وابستگی‌ها و تنظیم کلاس اصلی در فایل manifest را ارائه می‌دهد.

  • @SpringBootApplication

یک composite annotation اصلی در کلاس راه‌انداز است که سه انوتیشن @SpringBootConfiguration، @EnableAutoConfiguration و @ComponentScan را در یک پکیج واحد ترکیب می‌کند.

  • @SpringBootConfiguration

فرم تخصصی‌شده‌ای از انوتیشن @Configuration در فریم‌ورک Spring است که کلاس را به‌عنوان یک منبع تعریف beanهای جاوا معرفی می‌کند.

  • @EnableAutoConfiguration

انوتیشنی که به Spring Boot دستور می‌دهد پیکربندی‌های لازم را بر اساس کتابخانه‌های موجود در classpath به‌صورت خودکار بسازد و مقداردهی کند.

  • @ComponentScan

مکانیزمی که پکیج جاری و زیرپکیج‌های آن را برای کشف خودکار کلاس‌های دارای انوتیشن‌های کانتینر مانند @Component، @Service و @Controller پویش می‌کند.

  • Bootstrap Class

کلاس اصلی نقطه شروع برنامه است که متد public static void main را در بر دارد و فرآیند راه‌اندازی فریم‌ورک را آغاز می‌کند.

  • SpringApplication.run()

یک متد استاتیک که با دریافت کلاس پیکربندی و آرگومان‌های خط فرمان، ApplicationContext را ساخته و فرآیند bootstrapping کل برنامه را هدایت می‌کند.

  • application.properties

فایل متنی استاندارد در src/main/resources است که مقادیر و تنظیمات پیکربندی محیطی برنامه در آن مقداردهی می‌شود.

  • Static Content Directory

پوشه src/main/resources/static برای ذخیره و ارائه مستقیم فایل‌های ثابت به مرورگر نظیر کدهای CSS، فایل‌های JavaScript و تصاویر است.

  • Templates Directory

پوشه src/main/resources/templates که محل قرارگیری قالب‌های رندر سمت سرور مانند صفحات وب بر پایه‌ی موتور Thymeleaf است.

موارد مصاحبه ای

  • تفاوت اصلی وابستگی‌های starter با وابستگی‌های معمولی چیست؟

وابستگی‌های معمولی مستقیماً یک کتابخانه واحد را اضافه می‌کنند، اما starterها مجموعه‌ای از وابستگی‌های هماهنگ و تست‌شده را بر اساس نیاز عملکردی به‌صورت transitive بدون نیاز به تعریف تک‌تک آن‌ها وارد پروژه می‌کنند.

  • مزیت استفاده از spring-boot-starter-parent در مدیریت وابستگی‌ها چیست؟

نسخه‌های سازگار تمام کتابخانه‌های اصلی و فرعی را مشخص می‌کند؛ بنابراین برنامه‌نویس نیازی به نوشتن تگ <version> برای وابستگی‌های تحت پوشش ندارد و ریسک ناسازگاری نسخه‌ها از بین می‌رود.

  • انوتیشن @SpringBootApplication شامل چه انوتیشن‌های زیرمجموعه‌ای است؟

ترکیبی از @SpringBootConfiguration برای پیکربندی beanها، @EnableAutoConfiguration برای فعال‌سازی پیکربندی خودکار و @ComponentScan برای اسکن خودکار کامپوننت‌ها است.

  • وظایف اصلی Spring Boot Maven Plugin در چرخه بیلد چیست؟

ساخت یک فایل اجرایی JAR مستقل که همه کتابخانه‌ها را در بر دارد (fat JAR)، افزودن متد راه‌انداز به فایل MANIFEST.MF و فراهم کردن امکان اجرای پروژه با دستور mvn spring-boot:run.

  • فرآیند فراخوانی متد SpringApplication.run چه کارهایی انجام می‌دهد؟

این متد لود کردن محیط، ساخت و آماده‌سازی کانتینر ApplicationContext، اعمال auto-configurationها، اجرای component scanning و بالا آوردن وب‌سرور تعبیه‌شده را مدیریت می‌کند.

  • تفاوت پوشه static و پوشه templates در منابع پروژه چیست؟

محتوای درون پوشه static بدون تغییر و پردازش مستقیم از طریق وب‌سرور ارائه می‌شود، در حالی که فایل‌های درون templates باید توسط یک Template Engine مانند Thymeleaf روی سرور رندر شوند.

سناریو کاربردی

  • راه‌اندازی ساختار پروژه و ساخت بسته اجرایی

در یک پروژه وب، ساختار فایل‌ها و نحوه اجرای برنامه به شکل زیر مدیریت می‌شود:

۱. کلاس راه‌انداز اصلی (Bootstrap Class):

package com.example.tacocloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TacoCloudApplication {

    public static void main(String[] args) {
        SpringApplication.run(TacoCloudApplication.class, args);
    }
}

۲. پیکربندی وابستگی‌ها در pom.xml: کلاس والد spring-boot-starter-parent نسخه فریم‌ورک را کنترل می‌کند و برای وابستگی‌هایی مانند spring-boot-starter-web یا spring-boot-starter-thymeleaf نیازی به تعیین دستی نسخه نیست:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.6</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-thymeleaf</artifactId>
    </dependency>
</dependencies>

۳. چرخه بیلد و اجرا: با اجرای دستور بیلد توسط پلاگین، یک فایل JAR یکپارچه تولید می‌شود که پس از اجرا، متد main فراخوانی شده، کانتینر Spring ساخته می‌شود و کلیه کنترلرها و قالب‌ها بدون نیاز به نصب سرور خارجی در دسترس قرار می‌گیرند.

بیشتر بدانید

  • تست بارگذاری کانتینر

کلاس تست اولیه مانند TacoCloudApplicationTests اعتبارسنجی می‌کند که کل ApplicationContext بدون خطا بالا می‌آید و پیکربندی‌ها درست هستند.

  • سفارشی‌سازی پیکربندی‌ها

اگرچه می‌توان beanهای سفارشی را درون همان کلاس Bootstrap تعریف کرد، اما ساختار استاندارد ایجاب می‌کند که برای ماژول‌های مختلف، کلاس‌های جداگانه‌ای با انوتیشن @Configuration ساخته شود.

  • ابزار توسعه DevTools

وابستگی spring-boot-devtools با قابلیت‌هایی مثل Automatic Restart و LiveReload سرعت چرخه توسعه و اعمال تغییرات کد را افزایش می‌دهد.

  • تنظیمات پویا با application.properties

تمامی رفتارهای پیش‌فرض کانتینر، از جمله شماره پورت وب‌سرور یا سطح لاگ‌ها، بدون نیاز به تغییر کد و تنها با افزودن کلیدهای مربوطه در فایل src/main/resources/application.properties قابل تغییر هستند.