Spring Project Structure | ساختار پروژه اسپرینگ
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- 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 قابل تغییر هستند.
