Spring in Action Chapter 1 Section 1 | کتاب spring in action فصل اول قسمت اول
📖توضیحات درس
📄جزوه
مفاهیم کلیدی
- 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 مطمئن شوید.
