📣اطلاعیه
... به دلیل بروزرسانی فنی، سایت جاواپرو این هفته ممکن است با اختلال همراه شود.
از صبر و شکیبایی شما سپاسگزاریم.
javapro.ir
academyjavapro.com
... به دلیل بروزرسانی فنی، سایت جاواپرو این هفته ممکن است با اختلال همراه شود.
از صبر و شکیبایی شما سپاسگزاریم.
javapro.ir
academyjavapro.com
❤1
برنامه نویسی جاوا | جاواپرو
📌 معرفی معماری لایهای در Spring Boot (Controller, Service, Repository) سلام دوستان عزیز در این پیام قصد داریم معماری استاندارد پروژههای Spring Boot را بررسی کنیم. این معماری به ما کمک میکند برنامههایی قابل نگهداری، منظم و قابل توسعه ایجاد کنیم. پروژههای…
📌 مدیریت Beanها و آشنایی با Component Scan در Spring Boot
سلام دوستان عزیز
در این پیام با یکی از مهمترین مفاهیم اساسی Spring Boot آشنا میشویم؛ یعنی Beanها و نحوهی مدیریت آنها توسط فریمورک اسپرینگ. درک این بخش برای فهم عمیق IoC و Dependency Injection کاملاً ضروری است.
۱) مفهوم Bean در Spring
«بین» در اسپرینگ به هر شیئی گفته میشود که توسط Spring Container ساخته، مدیریت و نگهداری میشود. به بیان ساده، هر کلاسی که اسپرینگ مسئول ساخت آن باشد، یک Bean محسوب میشود.
این مدیریت شامل ساخت شیء، تزریق وابستگیها، تعیین طول عمر و نابودی آن است.
به طور مثال، کلاسی که با Annotation خاصی علامتگذاری شود، به صورت خودکار به یک Bean تبدیل میشود.
۲) نقش Spring Container
«کانتینر» اسپرینگ محیطی است که تمام Beanها را در خود نگهداری میکند. این کانتینر هنگام اجرای برنامه فعال میشود و بر اساس تنظیمات و Annotationها، اشیاء موردنیاز را میسازد و به هم متصل میکند.
زمانی که در کنترلر یا سرویس از یک کلاس دیگر استفاده میکنیم، در واقع از Container درخواست میکنیم که آن Bean را در اختیار ما قرار دهد.
۳) Annotationهای معرفی Bean
«نشانهگذاری» در اسپرینگ معمولاً از طریق Annotationها انجام میشود. مهمترین Annotationها برای معرفی Bean عبارتاند از:
علاوه بر @Component، سه Annotation تخصصیتر نیز وجود دارد:
* @Controller برای لایه کنترلر
* @Service برای منطق برنامه
* @Repository برای دسترسی به دیتابیس
از نظر عملکرد همگی Bean هستند، اما از نظر مفهومی نقش متفاوتی دارند.
۴) مفهوم Component Scan
«اسکن» کامپوننت فرآیندی است که طی آن Spring Boot به صورت خودکار کلاسهای علامتگذاریشده را پیدا میکند و آنها را به عنوان Bean ثبت میکند.
این اسکن به صورت پیشفرض از پکیجی که کلاس اصلی برنامه در آن قرار دارد آغاز میشود و تمام زیرپکیجها را بررسی میکند.
به همین دلیل توصیه میشود همهی پکیجها زیر پکیج اصلی پروژه قرار گیرند.
۵) تزریق وابستگی با Constructor Injection
«تزریق» وابستگی در اسپرینگ معمولاً از طریق سازنده انجام میشود که بهترین و امنترین روش است. مثال زیر نحوهی تزریق یک Bean به Bean دیگر را نشان میدهد:
در این مثال، Spring خودش Bean مربوط به EmailSender را ساخته و به NotificationService تزریق میکند.
۶) چرایی اهمیت Bean Management
«اهمیت» مدیریت Beanها در این است که برنامه بدون وابستگی شدید بین کلاسها نوشته میشود. این موضوع باعث افزایش خوانایی، تستپذیری و توسعهپذیری پروژه میشود و یکی از دلایل اصلی قدرت Spring محسوب میگردد.
۷) جمعبندی پیام
«نتیجه» این است که Beanها اجزای اصلی برنامههای Spring Boot هستند و Spring Container با استفاده از Component Scan آنها را شناسایی و مدیریت میکند. در پیام بعدی وارد مبحث بسیار مهم Scope Beanها (Singleton و Prototype) و طول عمر اشیاء در اسپرینگ میشویم.
سلام دوستان عزیز
در این پیام با یکی از مهمترین مفاهیم اساسی Spring Boot آشنا میشویم؛ یعنی Beanها و نحوهی مدیریت آنها توسط فریمورک اسپرینگ. درک این بخش برای فهم عمیق IoC و Dependency Injection کاملاً ضروری است.
۱) مفهوم Bean در Spring
«بین» در اسپرینگ به هر شیئی گفته میشود که توسط Spring Container ساخته، مدیریت و نگهداری میشود. به بیان ساده، هر کلاسی که اسپرینگ مسئول ساخت آن باشد، یک Bean محسوب میشود.
این مدیریت شامل ساخت شیء، تزریق وابستگیها، تعیین طول عمر و نابودی آن است.
به طور مثال، کلاسی که با Annotation خاصی علامتگذاری شود، به صورت خودکار به یک Bean تبدیل میشود.
۲) نقش Spring Container
«کانتینر» اسپرینگ محیطی است که تمام Beanها را در خود نگهداری میکند. این کانتینر هنگام اجرای برنامه فعال میشود و بر اساس تنظیمات و Annotationها، اشیاء موردنیاز را میسازد و به هم متصل میکند.
زمانی که در کنترلر یا سرویس از یک کلاس دیگر استفاده میکنیم، در واقع از Container درخواست میکنیم که آن Bean را در اختیار ما قرار دهد.
۳) Annotationهای معرفی Bean
«نشانهگذاری» در اسپرینگ معمولاً از طریق Annotationها انجام میشود. مهمترین Annotationها برای معرفی Bean عبارتاند از:
@Component
public class EmailSender {
public void send() {
System.out.println("Sending email...");
}
}
علاوه بر @Component، سه Annotation تخصصیتر نیز وجود دارد:
* @Controller برای لایه کنترلر
* @Service برای منطق برنامه
* @Repository برای دسترسی به دیتابیس
از نظر عملکرد همگی Bean هستند، اما از نظر مفهومی نقش متفاوتی دارند.
۴) مفهوم Component Scan
«اسکن» کامپوننت فرآیندی است که طی آن Spring Boot به صورت خودکار کلاسهای علامتگذاریشده را پیدا میکند و آنها را به عنوان Bean ثبت میکند.
این اسکن به صورت پیشفرض از پکیجی که کلاس اصلی برنامه در آن قرار دارد آغاز میشود و تمام زیرپکیجها را بررسی میکند.
به همین دلیل توصیه میشود همهی پکیجها زیر پکیج اصلی پروژه قرار گیرند.
۵) تزریق وابستگی با Constructor Injection
«تزریق» وابستگی در اسپرینگ معمولاً از طریق سازنده انجام میشود که بهترین و امنترین روش است. مثال زیر نحوهی تزریق یک Bean به Bean دیگر را نشان میدهد:
@Service
public class NotificationService {
private final EmailSender emailSender;
public NotificationService(EmailSender emailSender) {
this.emailSender = emailSender;
}
public void notifyUser() {
emailSender.send();
}
}
در این مثال، Spring خودش Bean مربوط به EmailSender را ساخته و به NotificationService تزریق میکند.
۶) چرایی اهمیت Bean Management
«اهمیت» مدیریت Beanها در این است که برنامه بدون وابستگی شدید بین کلاسها نوشته میشود. این موضوع باعث افزایش خوانایی، تستپذیری و توسعهپذیری پروژه میشود و یکی از دلایل اصلی قدرت Spring محسوب میگردد.
۷) جمعبندی پیام
«نتیجه» این است که Beanها اجزای اصلی برنامههای Spring Boot هستند و Spring Container با استفاده از Component Scan آنها را شناسایی و مدیریت میکند. در پیام بعدی وارد مبحث بسیار مهم Scope Beanها (Singleton و Prototype) و طول عمر اشیاء در اسپرینگ میشویم.
#Spring
🆔 @javapro_ir
🆔 @group_javapro
👍4❤1
تحلیل سلسله مراتبی فیلترها در Spring Cloud Gateway
در این مقاله با معماری فیلترها در Spring Cloud Gateway آشنا میشوید و نقش WebFilter، GlobalFilter و GatewayFilter در زنجیره پردازش درخواستها را بررسی میکنیم.
مشاهده مقاله
در این مقاله با معماری فیلترها در Spring Cloud Gateway آشنا میشوید و نقش WebFilter، GlobalFilter و GatewayFilter در زنجیره پردازش درخواستها را بررسی میکنیم.
مشاهده مقاله
🆔 @javapro_ir
🆔 @group_javapro
📌 موضوع Scope Beanها و تفاوت Singleton و Prototype در Spring
سلام دوستان عزیز
در ادامهی آشنایی با Beanها، در این پیام به بررسی Scope یا محدودهی عمر Beanها در Spring میپردازیم. درک این مفهوم به ما کمک میکند بفهمیم هر شیء چه زمانی ساخته میشود و چند بار مورد استفاده قرار میگیرد.
۱) مفهوم Scope در Spring
«اسکوپ» مشخص میکند که از یک Bean چند نمونه ساخته شود و طول عمر آن چگونه باشد. به طور پیشفرض، Spring برای هر Bean فقط یک نمونه میسازد؛ اما این رفتار قابل تغییر است. انتخاب Scope مناسب تأثیر مستقیم بر عملکرد و منطق برنامه دارد.
۲) Singleton Scope (پیشفرض)
«سینگلتون» رایجترین و پیشفرضترین Scope در Spring است. در این حالت، تنها یک نمونه از Bean در کل برنامه ساخته میشود و همهی بخشها از همان نمونه استفاده میکنند.
مثال:
در این مثال، اگر این سرویس در چند کنترلر تزریق شود، همگی به یک شیء مشترک اشاره میکنند.
این نوع Scope برای سرویسها و منطقهای عمومی بسیار مناسب است.
۳) Prototype Scope
«پروتوتایپ» به این معناست که هر بار که یک Bean درخواست شود، یک نمونهی جدید ساخته میشود. این Scope برای مواقعی کاربرد دارد که هر استفاده نیازمند وضعیت (State) جداگانه باشد.
مثال:
در این حالت، هر بار که ReportGenerator تزریق یا دریافت شود، یک شیء جدید ایجاد میشود.
۴) مقایسه عملی Singleton و Prototype
«مقایسه» این دو Scope را میتوان با یک مثال ساده درک کرد.
اگر یک سرویس پردازش کاربران داشته باشیم، استفاده از Singleton منطقی است؛ زیرا منطق مشترک است.
اما اگر کلاسی برای ساخت گزارش لحظهای داشته باشیم که اطلاعات خاص هر درخواست را نگه میدارد، Prototype گزینهی بهتری است.
۵) رفتار Spring Container با Scopeها
«رفتار» Spring Container در مورد Singleton این است که Bean در زمان بالا آمدن برنامه ساخته میشود.
اما در Prototype، Bean فقط زمانی ساخته میشود که واقعاً درخواست شود و Spring مسئول نابودی آن نخواهد بود.
این تفاوت مهمی است که در طراحی سیستمهای بزرگ باید به آن توجه شود.
۶) چرا بیشتر Beanها Singleton هستند؟
«دلیل» اصلی استفاده گسترده از Singleton این است که Spring به صورت Stateless طراحی شده است. سرویسها معمولاً وضعیت داخلی ندارند و میتوانند به صورت مشترک استفاده شوند. این موضوع باعث مصرف کمتر حافظه و عملکرد بهتر برنامه میشود.
۷) جمعبندی پیام
«نتیجه» این است که Scope مشخص میکند از هر Bean چند نمونه ساخته شود. Singleton برای اغلب سرویسها انتخاب مناسبی است و Prototype فقط در شرایط خاص استفاده میشود. در پیام بعدی وارد مبحث بسیار مهم تزریق وابستگی (Dependency Injection) و انواع آن در Spring خواهیم شد.
سلام دوستان عزیز
در ادامهی آشنایی با Beanها، در این پیام به بررسی Scope یا محدودهی عمر Beanها در Spring میپردازیم. درک این مفهوم به ما کمک میکند بفهمیم هر شیء چه زمانی ساخته میشود و چند بار مورد استفاده قرار میگیرد.
۱) مفهوم Scope در Spring
«اسکوپ» مشخص میکند که از یک Bean چند نمونه ساخته شود و طول عمر آن چگونه باشد. به طور پیشفرض، Spring برای هر Bean فقط یک نمونه میسازد؛ اما این رفتار قابل تغییر است. انتخاب Scope مناسب تأثیر مستقیم بر عملکرد و منطق برنامه دارد.
۲) Singleton Scope (پیشفرض)
«سینگلتون» رایجترین و پیشفرضترین Scope در Spring است. در این حالت، تنها یک نمونه از Bean در کل برنامه ساخته میشود و همهی بخشها از همان نمونه استفاده میکنند.
مثال:
@Service
public class UserService {
}
در این مثال، اگر این سرویس در چند کنترلر تزریق شود، همگی به یک شیء مشترک اشاره میکنند.
این نوع Scope برای سرویسها و منطقهای عمومی بسیار مناسب است.
۳) Prototype Scope
«پروتوتایپ» به این معناست که هر بار که یک Bean درخواست شود، یک نمونهی جدید ساخته میشود. این Scope برای مواقعی کاربرد دارد که هر استفاده نیازمند وضعیت (State) جداگانه باشد.
مثال:
@Component
@Scope("prototype")
public class ReportGenerator {
}
در این حالت، هر بار که ReportGenerator تزریق یا دریافت شود، یک شیء جدید ایجاد میشود.
۴) مقایسه عملی Singleton و Prototype
«مقایسه» این دو Scope را میتوان با یک مثال ساده درک کرد.
اگر یک سرویس پردازش کاربران داشته باشیم، استفاده از Singleton منطقی است؛ زیرا منطق مشترک است.
اما اگر کلاسی برای ساخت گزارش لحظهای داشته باشیم که اطلاعات خاص هر درخواست را نگه میدارد، Prototype گزینهی بهتری است.
۵) رفتار Spring Container با Scopeها
«رفتار» Spring Container در مورد Singleton این است که Bean در زمان بالا آمدن برنامه ساخته میشود.
اما در Prototype، Bean فقط زمانی ساخته میشود که واقعاً درخواست شود و Spring مسئول نابودی آن نخواهد بود.
این تفاوت مهمی است که در طراحی سیستمهای بزرگ باید به آن توجه شود.
۶) چرا بیشتر Beanها Singleton هستند؟
«دلیل» اصلی استفاده گسترده از Singleton این است که Spring به صورت Stateless طراحی شده است. سرویسها معمولاً وضعیت داخلی ندارند و میتوانند به صورت مشترک استفاده شوند. این موضوع باعث مصرف کمتر حافظه و عملکرد بهتر برنامه میشود.
۷) جمعبندی پیام
«نتیجه» این است که Scope مشخص میکند از هر Bean چند نمونه ساخته شود. Singleton برای اغلب سرویسها انتخاب مناسبی است و Prototype فقط در شرایط خاص استفاده میشود. در پیام بعدی وارد مبحث بسیار مهم تزریق وابستگی (Dependency Injection) و انواع آن در Spring خواهیم شد.
#Spring
🆔 @javapro_ir
🆔 @group_javapro
👍7❤2
سوال یکی از کاربران جاواپرو
برای مصاحبه نیاز به یادگیری هایبرنیت دارم، در بین دوره های جاواپرو دوره ای هست که ی ذره هایبرنیت رو بررسی کرده باشه؟
یکی از اهداف دوره Spring Core همین است. و بسیار زیاد هایبرنیت بررسی شده.
سرفصل های هایبرنیت آکادمی جاواپرو کامله و جایی این مباحث رو پیدا نمیکنید که تدریس شده باشه
مشاهده جزییات و ثبت نام
برای مصاحبه نیاز به یادگیری هایبرنیت دارم، در بین دوره های جاواپرو دوره ای هست که ی ذره هایبرنیت رو بررسی کرده باشه؟
یکی از اهداف دوره Spring Core همین است. و بسیار زیاد هایبرنیت بررسی شده.
سرفصل های هایبرنیت آکادمی جاواپرو کامله و جایی این مباحث رو پیدا نمیکنید که تدریس شده باشه
مشاهده جزییات و ثبت نام
آکادمی جاواپرو
دوره طلایی Spring Core
این دوره به شما کمک میکند تا با مبانی Spring Boot آشنا شوید و مهارتهای لازم برای توسعهی برنامههای کاربردی مبتنی بر این فریمورک محبوب جاوا را کسب کنید.
❤2
برنامه نویسی جاوا | جاواپرو
📌 موضوع Scope Beanها و تفاوت Singleton و Prototype در Spring سلام دوستان عزیز در ادامهی آشنایی با Beanها، در این پیام به بررسی Scope یا محدودهی عمر Beanها در Spring میپردازیم. درک این مفهوم به ما کمک میکند بفهمیم هر شیء چه زمانی ساخته میشود و چند بار…
📌 موضوع: Dependency Injection و روشهای تزریق وابستگی در Spring Boot
سلام دوستان عزیز
در این پیام به یکی از بنیادیترین مفاهیم Spring Boot میپردازیم؛ مفهومی که تقریباً در تمام بخشهای پروژههای حرفهای استفاده میشود و نقش کلیدی در تمیزی معماری دارد. این مفهوم چیزی نیست جز تزریق وابستگی یا Dependency Injection.
۱) مفهوم Dependency Injection
«تزریق» وابستگی به این معناست که یک کلاس، اشیای موردنیاز خود را **خودش نسازد**، بلکه آنها را از بیرون دریافت کند. در Spring Boot این کار توسط Spring Container انجام میشود.
این رویکرد باعث کاهش وابستگی مستقیم بین کلاسها و افزایش تستپذیری و انعطافپذیری برنامه میشود.
به بیان ساده، کلاسها فقط اعلام میکنند به چه چیزی نیاز دارند و Spring آن را فراهم میکند.
۲) مشکل ساخت مستقیم اشیا
«مشکل» روش سنتی این است که کلاسها به هم وابستگی شدید پیدا میکنند. مثال زیر یک روش نامناسب است:
در این حالت OrderService به پیادهسازی EmailSender قفل شده است و تغییر یا تست آن بسیار دشوار میشود.
۳) تزریق وابستگی با Constructor Injection
«تزریق» از طریق سازنده بهترین و توصیهشدهترین روش در Spring است. در این روش وابستگیها از طریق سازنده کلاس دریافت میشوند.
در این مثال، Spring به صورت خودکار Bean مربوط به EmailSender را ساخته و تزریق میکند. این روش امن، شفاف و قابل تست است.
۴) تزریق وابستگی با Field Injection
«تزریق» فیلدی با استفاده از @Autowired انجام میشود. هرچند این روش سادهتر به نظر میرسد، اما توصیه نمیشود.
این روش تستپذیری را کاهش میدهد و وابستگیها را مخفی میکند.
۵) تزریق وابستگی با Setter Injection
«تزریق» از طریق Setter برای مواقعی استفاده میشود که وابستگی اختیاری باشد.
در این حالت میتوان وابستگی را بعداً تغییر داد، اما برای وابستگیهای اصلی توصیه نمیشود.
۶) استفاده از Interface در DI
«استفاده» از Interface باعث میشود وابستگیها به پیادهسازی خاصی قفل نشوند.
در این ساختار میتوان به راحتی پیادهسازیها را تغییر داد.
۷) جمعبندی پیام
«نتیجه» این است که Dependency Injection هستهی اصلی Spring Boot محسوب میشود. استفاده از Constructor Injection به همراه Interfaceها باعث تولید کدی تمیز، قابل تست و حرفهای میشود. در پیام بعدی وارد مبحث Configuration، فایل application.properties و مدیریت تنظیمات پروژه خواهیم شد.
سلام دوستان عزیز
در این پیام به یکی از بنیادیترین مفاهیم Spring Boot میپردازیم؛ مفهومی که تقریباً در تمام بخشهای پروژههای حرفهای استفاده میشود و نقش کلیدی در تمیزی معماری دارد. این مفهوم چیزی نیست جز تزریق وابستگی یا Dependency Injection.
۱) مفهوم Dependency Injection
«تزریق» وابستگی به این معناست که یک کلاس، اشیای موردنیاز خود را **خودش نسازد**، بلکه آنها را از بیرون دریافت کند. در Spring Boot این کار توسط Spring Container انجام میشود.
این رویکرد باعث کاهش وابستگی مستقیم بین کلاسها و افزایش تستپذیری و انعطافپذیری برنامه میشود.
به بیان ساده، کلاسها فقط اعلام میکنند به چه چیزی نیاز دارند و Spring آن را فراهم میکند.
۲) مشکل ساخت مستقیم اشیا
«مشکل» روش سنتی این است که کلاسها به هم وابستگی شدید پیدا میکنند. مثال زیر یک روش نامناسب است:
public class OrderService {
private EmailSender emailSender = new EmailSender();
}
در این حالت OrderService به پیادهسازی EmailSender قفل شده است و تغییر یا تست آن بسیار دشوار میشود.
۳) تزریق وابستگی با Constructor Injection
«تزریق» از طریق سازنده بهترین و توصیهشدهترین روش در Spring است. در این روش وابستگیها از طریق سازنده کلاس دریافت میشوند.
@Service
public class OrderService {
private final EmailSender emailSender;
public OrderService(EmailSender emailSender) {
this.emailSender = emailSender;
}
}
در این مثال، Spring به صورت خودکار Bean مربوط به EmailSender را ساخته و تزریق میکند. این روش امن، شفاف و قابل تست است.
۴) تزریق وابستگی با Field Injection
«تزریق» فیلدی با استفاده از @Autowired انجام میشود. هرچند این روش سادهتر به نظر میرسد، اما توصیه نمیشود.
@Service
public class OrderService {
@Autowired
private EmailSender emailSender;
}
این روش تستپذیری را کاهش میدهد و وابستگیها را مخفی میکند.
۵) تزریق وابستگی با Setter Injection
«تزریق» از طریق Setter برای مواقعی استفاده میشود که وابستگی اختیاری باشد.
@Service
public class OrderService {
private EmailSender emailSender;
@Autowired
public void setEmailSender(EmailSender emailSender) {
this.emailSender = emailSender;
}
}
در این حالت میتوان وابستگی را بعداً تغییر داد، اما برای وابستگیهای اصلی توصیه نمیشود.
۶) استفاده از Interface در DI
«استفاده» از Interface باعث میشود وابستگیها به پیادهسازی خاصی قفل نشوند.
public interface MessageSender {
void send(String message);
}
@Component
public class EmailSender implements MessageSender {
public void send(String message) {
System.out.println(message);
}
}
@Service
public class NotificationService {
private final MessageSender messageSender;
public NotificationService(MessageSender messageSender) {
this.messageSender = messageSender;
}
}
در این ساختار میتوان به راحتی پیادهسازیها را تغییر داد.
۷) جمعبندی پیام
«نتیجه» این است که Dependency Injection هستهی اصلی Spring Boot محسوب میشود. استفاده از Constructor Injection به همراه Interfaceها باعث تولید کدی تمیز، قابل تست و حرفهای میشود. در پیام بعدی وارد مبحث Configuration، فایل application.properties و مدیریت تنظیمات پروژه خواهیم شد.
#Spring
🆔 @javapro_ir
🆔 @group_javapro
👍7❤1