Farzad Afi Logo

FarzadAfi

آموزش تخصصی برنامه نویسی

Spring in Action Chapter 1 Section 1 | کتاب spring in action فصل اول قسمت اول

📖توضیحات درس

🎥 این ویدیو قسمت صد و یکم از بوت‌کمپ رایگان جاوا است. 🚀 بالاخره وارد یکی از جذاب‌ترین و مهم‌ترین فصل‌های مسیر توسعه بک‌اند شدیم: "Spring in Action". در این قسمت که دومین ویدیو از پلی‌لیست Spring in Action است، با جدیتِ تمام شروع می‌کنیم به بررسی فصل اول کتاب مرجع Spring in Action (نسخه ۶)؛ جایی که زیربنای تسلط شما بر اکوسیستم Spring ساخته می‌شود. در این جلسه، سفرمان را از درکِ عمیق فلسفه Spring شروع می‌کنیم و بلافاصله وارد دنیای عملیاتی پیاده‌سازی پروژه می‌شویم. این ویدیو برای کسانی است که می‌خواهند از سطح مفاهیم پایه عبور کنند و استاندارد واقعیِ توسعه با Spring Boot را یاد بگیرند. در این جلسه یاد می‌گیریم: 🔹 **شناخت Spring:** بررسی می‌کنیم که Spring چیست، چه مشکلاتی را از دوش توسعه‌دهندگان برداشته و چرا مفاهیمی مثل Inversion of Control (IoC) و Dependency Injection (DI) قلب تپنده این فریم‌ورک هستند. 🔹 **شروع سریع با Spring Boot:** آشنایی با ابزار فوق‌العاده Spring Initializr که دنیای تنظیمات دستیِ خسته‌کننده را تغییر داده است. یاد می‌گیریم چطور در چند ثانیه یک پروژه استاندارد را استارت بزنیم. 🔹 **مهندسی ساختار پروژه:** بررسی دقیق لایه‌ها، فایل‌های پیکربندی (Maven/Gradle) و ساختار دایرکتوری‌ها که دیدِ یک معمار نرم‌افزار را به شما می‌دهد. اگر می‌خواهید مسیر حرفه‌ای شدن در بک‌اند و تسلط بر فریم‌ورک‌های استاندارد صنعت را طی کنید، این سری ویدیوها بهترین نقطه شروع شماست. آیدی گروه پرسش و پاسخمون داخل تلگرام: programmingByFarzadAfi@ 💬 گروه پرسش و پاسخ بله: @programming_by_farzadafi وب سایت: https://farzadafi.ir هر سوالی داشته باشید میتونید داخل این گروه بپرسید تا خودم یا مربی هایی که در گروه حضور دارن کمکتون کنیم :) بوت کمپ رایگان جاوا آموزش جاوا پروژه محور
01:00:15🎯رایگان

📄جزوه

مفاهیم کلیدی

  • Spring Framework

Spring یک framework برای توسعه applicationهای Java است که هدف اصلی آن ساده‌سازی ساخت، مدیریت و اتصال componentهای مختلف برنامه است. این framework برای web application، data access، security، integration، microservices و reactive programming ابزارهای متنوعی ارائه می‌دهد.

  • Spring Application Context

هسته اصلی Spring یک container به نام Spring Application Context است. این container مسئول ساختن، نگهداری و مدیریت beanها و همچنین اتصال آن‌ها به یکدیگر است.

  • Bean

در Spring، هر objectای که توسط container ساخته و مدیریت شود یک bean محسوب می‌شود. beanها componentهای اصلی application هستند که منطق‌های مختلف سیستم را پیاده‌سازی می‌کنند.

  • Dependency Injection

Dependency Injection یا DI الگویی است که در آن objectها dependencyهای خود را مستقیماً ایجاد نمی‌کنند، بلکه container آن dependencyها را ساخته و به آن‌ها تزریق می‌کند. این کار باعث کاهش coupling و افزایش testability می‌شود.

  • Constructor Injection

یکی از رایج‌ترین روش‌های Dependency Injection است که در آن dependencyها از طریق constructor به class تزریق می‌شوند. این روش برای dependencyهای اجباری مناسب‌تر است.

  • Container-Managed Wiring

در Spring، اتصال beanها به یکدیگر توسط container انجام می‌شود. یعنی به جای اینکه یک service خودش service دیگر را بسازد، Spring آن dependency را پیدا کرده و inject می‌کند.

  • XML Configuration

در نسخه‌های قدیمی‌تر Spring، تعریف beanها و ارتباطشان معمولاً با فایل‌های XML انجام می‌شد. در این روش، ساختار beanها و wiring آن‌ها به صورت declarative در فایل پیکربندی نوشته می‌شد.

  • Java-Based Configuration

در Spring مدرن، پیکربندی با Java classها رایج‌تر است. با استفاده از annotationهایی مثل @Configuration و @Bean می‌توان beanها را تعریف کرد. این روش نسبت به XML type-safeتر و refactor-friendlyتر است.

  • @Configuration

این annotation مشخص می‌کند که یک class نقش configuration class را دارد و می‌تواند beanهای موردنیاز Spring را تعریف کند.

  • @Bean

این annotation روی methodهایی قرار می‌گیرد که object بازگشتی آن‌ها باید به عنوان bean در Spring container ثبت شود.

  • Component Scanning

با Component Scanning، Spring classpath را بررسی می‌کند و classهایی را که annotationهایی مثل @Component، @Service و @Controller دارند، به صورت خودکار پیدا و register می‌کند.

  • Autowiring

Autowiring یعنی Spring به صورت خودکار dependencyهای موردنیاز beanها را پیدا کرده و به آن‌ها تزریق کند. این قابلیت نیاز به wiring دستی را کاهش می‌دهد.

  • Spring Boot

Spring Boot توسعه Spring را سریع‌تر و ساده‌تر می‌کند. این ابزار با فراهم کردن defaultهای مناسب، autoconfiguration، starter dependencyها و ابزارهای اجرایی، مقدار زیادی از configuration دستی را حذف می‌کند.

  • Autoconfiguration

ویژگی مهم Spring Boot است که بر اساس dependencyهای موجود در classpath، environment و context برنامه، beanهای لازم را به صورت خودکار configure می‌کند. هدف آن کاهش configuration صریح و راه‌اندازی سریع‌تر application است.

  • Spring Initializr

Spring Initializr ابزاری برای ساخت skeleton اولیه پروژه Spring Boot است. این ابزار project structure، build file و dependencyهای اولیه را تولید می‌کند تا توسعه‌دهنده سریع‌تر وارد فاز کدنویسی شود.

  • Project Structure in Spring Boot

ساختار استاندارد پروژه شامل بخش‌هایی مثل src/main/java برای source code، src/test/java برای testها و src/main/resources برای resourceها است. این ساختار توسعه و نگهداری پروژه را منظم می‌کند.

  • application.properties

فایلی برای تعریف configuration propertyهای application است. تنظیمات مختلف مانند port، datasource و behavior برخی componentها معمولاً در این فایل قرار می‌گیرند.

  • templates Directory

پوشه templates محل قرارگیری template fileها برای render کردن viewها به مرورگر است. در پروژه‌های Spring MVC معمولاً template engineهایی مثل Thymeleaf از این مسیر استفاده می‌کنند.

  • static Directory

پوشه static برای فایل‌های ثابت مثل CSS، JavaScript، image و assetهای frontend استفاده می‌شود.

  • Maven Wrapper

فایل‌های mvnw و mvnw.cmd امکان اجرای Maven را بدون نصب جداگانه Maven روی سیستم فراهم می‌کنند. این کار اجرای build را در تیم‌ها و environmentهای مختلف یکنواخت‌تر می‌کند.

  • pom.xml

فایل pom.xml مشخص‌کننده build configuration در Maven است. dependencyها، pluginها و parent project در این فایل تعریف می‌شوند.

  • Spring Boot Starter Dependencies

starterها dependencyهای آماده‌ای هستند که مجموعه‌ای از libraryهای مرتبط را به صورت یکجا وارد پروژه می‌کنند. مثلاً starter مربوط به web تمام libraryهای لازم برای ساخت web application را فراهم می‌کند.

  • Dependency Management

Spring Boot با استفاده از parent POM نسخه dependencyها را مدیریت می‌کند. در نتیجه معمولاً لازم نیست نسخه هر library به صورت دستی مشخص شود و سازگاری بین libraryها بهتر حفظ می‌شود.

  • Bootstrap Class

در Spring Boot یک class اصلی وجود دارد که application را راه‌اندازی می‌کند. این class معمولاً شامل method main() و annotation @SpringBootApplication است.

  • @SpringBootApplication

این annotation، annotation اصلی در Spring Boot است و سه قابلیت مهم را با هم ترکیب می‌کند:
@SpringBootConfiguration، @EnableAutoConfiguration و @ComponentScan

  • @EnableAutoConfiguration

این annotation به Spring Boot می‌گوید که بر اساس شرایط پروژه، beanها و configurationهای مناسب را به صورت خودکار فعال کند.

  • @ComponentScan

این annotation باعث می‌شود Spring packageها را اسکن کرده و componentهای annotation-based را پیدا و register کند.

  • SpringApplication.run()

متد SpringApplication.run() نقطه شروع bootstrapping application است. این متد Application Context را می‌سازد، beanها را initialize می‌کند و application را بالا می‌آورد.

  • Executable JAR

Spring Boot applicationها معمولاً به صورت executable JAR بسته‌بندی می‌شوند. این فایل JAR تمام dependencyهای لازم را در خود دارد و مستقیماً قابل اجراست.

  • Spring Boot Maven Plugin

این plugin اجرای application، ساخت executable JAR و تنظیم manifest مناسب برای تعیین main class را ساده می‌کند.

  • @SpringBootTest

این annotation برای testهای integration در Spring Boot استفاده می‌شود و باعث می‌شود Spring context در زمان test بالا بیاید تا صحت bootstrapping بررسی شود.

  • Context Load Test

یک test پایه در Spring Boot معمولاً فقط بررسی می‌کند که Application Context بدون خطا load شود. این نوع test برای شناسایی سریع خطاهای configuration بسیار مهم است.


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

  • Spring چیست و چه مشکلی را حل می‌کند؟

Spring یک framework برای مدیریت componentها، dependencyها و configuration application است که توسعه applicationهای enterprise را ساده‌تر، modularتر و قابل‌تست‌تر می‌کند.

  • Spring Application Context چیست؟

container مرکزی Spring است که beanها را می‌سازد، lifecycle آن‌ها را مدیریت می‌کند و dependencyهای لازم را به آن‌ها inject می‌کند.

  • Bean در Spring چیست؟

هر objectای که توسط Spring container ساخته و مدیریت شود، bean نام دارد.

  • Dependency Injection چیست؟

الگویی برای تزریق dependencyها از بیرون class است تا classها خودشان مسئول ساخت dependencyهایشان نباشند.

  • مزیت اصلی Dependency Injection چیست؟

کاهش coupling، افزایش testability، ساده‌تر شدن maintenance و جداسازی مسئولیت ساخت object از مصرف آن.

  • تفاوت XML Configuration و Java-Based Configuration چیست؟

XML Configuration مبتنی بر فایل‌های XML است، اما Java-Based Configuration با classها و annotationهای Java انجام می‌شود و از نظر type safety و refactoring مناسب‌تر است.

  • @Configuration و @Bean چه کاربردی دارند؟

@Configuration یک class را به عنوان configuration class معرفی می‌کند و @Bean مشخص می‌کند object بازگشتی یک method باید در context ثبت شود.

  • Component Scanning چیست؟

قابلیتی است که Spring با آن classهای دارای annotationهای component را به صورت خودکار پیدا و register می‌کند.

  • Autowiring چیست؟

مکانیزمی برای تزریق خودکار dependencyها توسط Spring بر اساس type یا metadata موجود.

  • Spring Boot چه تفاوتی با Spring Framework دارد؟

Spring Boot روی Spring ساخته شده و با autoconfiguration، starter dependencyها و conventionهای آماده، setup و development را سریع‌تر می‌کند.

  • Autoconfiguration در Spring Boot چیست؟

فرآیندی که در آن Spring Boot بر اساس dependencyها و environment پروژه، configuration مناسب را به صورت خودکار اعمال می‌کند.

  • @SpringBootApplication از چه annotationهایی تشکیل شده است؟

@SpringBootConfiguration، @EnableAutoConfiguration و @ComponentScan

  • نقش SpringApplication.run() چیست؟

این متد application را bootstrap می‌کند، Application Context را می‌سازد و Spring Boot app را اجرا می‌کند.

  • Spring Initializr چه کاربردی دارد؟

برای تولید سریع skeleton اولیه پروژه Spring Boot همراه با project structure و dependencyهای اولیه استفاده می‌شود.

  • Starter dependencyها چه مزیتی دارند؟

تعداد dependencyهای صریح را کاهش می‌دهند، انتخاب libraryها را ساده می‌کنند و مدیریت version compatibility را به Spring Boot می‌سپارند.

  • فایل pom.xml در پروژه Spring Boot چه نقشی دارد؟

build configuration، dependencyها، pluginها و parent project را مشخص می‌کند.

  • @SpringBootTest چه کاری انجام می‌دهد؟

Spring context را برای test بالا می‌آورد تا رفتار application در سطح integration تست شود.

  • چرا test بارگذاری context مهم است؟

چون خطاهای configuration، bean wiring و مشکلات bootstrapping را خیلی زود شناسایی می‌کند.


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

فرض کنید در یک application دو service داریم:

  • InventoryService برای دریافت موجودی کالا
  • ProductService برای ارائه اطلاعات محصول

ProductService برای کامل کردن اطلاعات محصول به InventoryService وابسته است.
اگر این وابستگی را به صورت دستی مدیریت کنیم، ProductService باید خودش InventoryService را بسازد یا نگه دارد. این کار coupling را زیاد می‌کند.

در Spring این وابستگی به کمک Dependency Injection مدیریت می‌شود.
در configuration مبتنی بر Java می‌توان این ارتباط را به شکل زیر تعریف کرد:

@Configuration
public class ServiceConfiguration {

    @Bean
    public InventoryService inventoryService() {
        return new InventoryService();
    }

    @Bean
    public ProductService productService() {
        return new ProductService(inventoryService());
    }
}

در این سناریو، Spring ابتدا InventoryService را می‌سازد، سپس آن را به ProductService تزریق می‌کند.
نتیجه این است که:

  • مسئولیت ساخت objectها از business logic جدا می‌شود
  • تست کردن ProductService ساده‌تر می‌شود
  • تغییر implementation dependency راحت‌تر انجام می‌شود

در Spring Boot حتی در بسیاری از موارد لازم نیست این wiring را هم به صورت دستی بنویسید، چون Component Scanning و Autoconfiguration بخش بزرگی از setup را خودکار انجام می‌دهند.


بیشتر بدانید

  • Java-Based Configuration معمولاً انتخاب بهتری است

نسبت به XML Configuration خواناتر، type-safeتر و refactor-friendlyتر است.

  • Autoconfiguration همیشه به معنی جادو نیست

منطق آن بر اساس dependencyهای موجود در classpath، environment و conventionهای Spring Boot عمل می‌کند.

  • در پروژه‌های ساده، configuration دستی را کم نگه دارید

اگر Spring Boot می‌تواند چیزی را خودش configure کند، معمولاً بهتر است از همان behavior پیش‌فرض استفاده کنید.

  • ساختار پروژه Spring Boot را بشناسید

پوشه‌های src/main/java، src/test/java، templates و static از پایه‌ای‌ترین بخش‌هایی هستند که در اکثر پروژه‌ها با آن‌ها کار می‌کنید.

  • از Maven Wrapper استفاده کنید

با ./mvnw یا mvnw.cmd می‌توانید پروژه را بدون نصب مستقیم Maven build و run کنید.

  • دستورات مهم شروع کار

برای build کردن پروژه از ./mvnw package، برای اجرا از ./mvnw spring-boot:run و برای اجرای testها از ./mvnw test استفاده می‌شود.

  • Starter dependencyها را بر اساس capability انتخاب کنید

به جای فکر کردن به تک‌تک libraryها، بر اساس نیازهایی مثل web، test یا template engine starter مناسب را اضافه کنید.

  • Bootstrap class را بیش از حد شلوغ نکنید

اگر configurationهای زیادی دارید، بهتر است آن‌ها را در classهای جداگانه قرار دهید تا main class ساده و تمیز بماند.

  • Empty context test هم ارزشمند است

حتی اگر test method خالی باشد، وجود @SpringBootTest باعث می‌شود حداقل از سالم بودن bootstrapping application مطمئن شوید.