📌 بهار-نت-002: درک IOC (وارونگی کنترل) و DI (تزریق وابستگی)

(مرجع: اسناد بهار – ظرف IOC)
🔹 IOC (وارونگی کنترل) چیست؟
💡 IOC یک اصل طراحی است که در آن کنترل ایجاد و مدیریت شی از توسعه دهنده به چارچوب (بهار) منتقل می شود.
🛠 قبل از IOC: ایجاد شیء سنتی (کنترل دستی)
public class PirateShip {
private Captain captain;
public PirateShip() {
this.captain = new Captain(); // MANUAL CREATION
}
}
❌ مشکل: کلاس وابستگی های خاص خود را ایجاد می کند و منجر به جفت شدن (آزمایش و نگهداری سخت تر).
⚡ IOC در عمل: بهار ایجاد شیء را کنترل می کند
با IOC ، بهار مسئول ایجاد و تزریق وابستگی ها است به جای توسعه دهنده این کار را به صورت دستی انجام می دهد.
@Component
public class Captain {
public String getCommand() {
return "Set sail, Matey! ☠️";
}
}
@Component
public class PirateShip {
private final Captain captain;
@Autowired
public PirateShip(Captain captain) {
this.captain = captain;
}
public String sail() {
return captain.getCommand();
}
}
💡 بهار تزریق می کند Captain
به عنوان مثال به PirateShip
به طور خودکار
تزریق وابستگی (DI) چیست؟
💡 تزریق وابستگی (DI) اینگونه است که بهار IOC را پیاده سازی می کند – به طور خودکار وابستگی های لازم را به اشیاء فراهم می کند.
✅ نه new
کلمه کلیدی مورد نیاز است.
✅ اشیاء به راحتی همراه هستند (تست و اصلاح آسان تر).
✅ پیکربندی آسانتر از طریق حاشیه نویسی یا XML.
📌 انواع تزریق وابستگی در بهار
(مرجع: اسناد بهار – تزریق وابستگی)
1⃣ تزریق سازنده (توصیه شده)
🚀 وابستگی ها را از طریق سازنده تزریق کنید (بهترین تمرین).
@Component
public class PirateShip {
private final Captain captain;
@Autowired
public PirateShip(Captain captain) { // Injecting dependency via constructor
this.captain = captain;
}
}
✅ بهترین برای وابستگی های اجباری.
✅ ناپذیری را تضمین می کند (زمینه های نهایی).
2⃣ تزریق تنظیم کننده
🚀 وابستگی ها را از طریق روش های تنظیم کننده تزریق کنید.
@Component
public class PirateShip {
private Captain captain;
@Autowired
public void setCaptain(Captain captain) { // Setter-based injection
this.captain = captain;
}
}
✅ برای وابستگی های اختیاری خوب است.
❌ می تواند منجر به اشیاء قابل تغییر (ایمن تر) شود.
3⃣ تزریق میدانی (توصیه نمی شود)
⚠ فیلدهای مستقیم تزریق با استفاده از @Autowired
بشر
@Component
public class PirateShip {
@Autowired
private Captain captain;
}
❌ یک عمل بد در نظر گرفته شده است زیرا:
- آزمایش سخت تر (هیچ راهی برای عبور از مسخره در تست ها نیست).
- تغییر ناپذیری (حالت کلاس را تغییر می دهد).
🔥 بهترین تمرین: هر زمان ممکن است از تزریق سازنده استفاده کنید!
📌 پروژه دستی: IOC و DI در عمل
مرحله 1: یک پروژه بوت بهار ایجاد کنید
1⃣ به Spring Initializr بروید
2⃣ انتخاب کنید:
- نسخه بوت بهار: آخرین پایدار
- وابستگی ها: وب بهار
- بسته بندی: jar 3⃣ کلیک کنید تولید کردن و پرونده zip را استخراج کنید.
مرحله 2: مؤلفه ها را تعریف کنید
📌 ایجاد a Captain
مؤلفه:
package com.example.springdi;
import org.springframework.stereotype.Component;
@Component
public class Captain {
public String giveOrder() {
return "All hands on deck, Matey! ☠️";
}
}
📌 ایجاد a PirateShip
مؤلفه ای که به آن بستگی دارد Captain
:
package com.example.springdi;
import org.springframework.stereotype.Component;
@Component
public class PirateShip {
private final Captain captain;
public PirateShip(Captain captain) {
this.captain = captain;
}
public String sail() {
return captain.giveOrder();
}
}
مرحله 3: یک کنترلر استراحت ایجاد کنید
📌 افشای PirateShip
رفتار از طریق API:
package com.example.springdi.controller;
import com.example.springdi.PirateShip;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/pirates")
public class PirateController {
private final PirateShip pirateShip;
public PirateController(PirateShip pirateShip) {
this.pirateShip = pirateShip;
}
@GetMapping("/sail")
public String sail() {
return pirateShip.sail();
}
}
مرحله 4: برنامه را اجرا کنید
💡 برنامه را با استفاده از:
mvn spring-boot:run
یا
./mvnw spring-boot:run
🌐 بازدید: http://localhost:8080/pirates/sail
🎉 شما باید ببینید:
All hands on deck, Matey! ☠️
📌 خلاصه
✅ IOC = بهار کنترل ایجاد شی و چرخه عمر را به دست می گیرد.
✅ di = تزریق وابستگی به جای ایجاد دستی آنها.
✅ تزریق سازنده بهترین تمرین است!
✅ ما یک برنامه بوت بهار واقعی ساختیم که نشان دهنده DI است!
📌 مباحث تحت پوشش در این بخش
📜 IOC و تزریق وابستگی (✔ تحت پوشش)
- IOC چیست؟ (بهار باعث ایجاد شی ، وارونگی کنترل می شود).
- دی چیست؟ (بهار وابستگی ها را تزریق می کند ، کاهش جفت).
- کانتینر IOC بهار (ApplicationContext & Beanfactory).
- انواع DI: سازنده ، تنظیم کننده ، تزریق میدانی (جوانب مثبت/منفی).
- بهترین روشها: تزریق سازنده> تزریق تنظیم کننده> تزریق میدانی.
boot boot و IOC بهار (✔ تحت پوشش)
- پیکربندی خودکار و اسکن Component.
- رفتار و محدودیت های autowired.
- چگونه IOC در یک پروژه بوت بهار ادغام می شود.
🔥 غذای کلیدی که باید برای امتحان به خاطر بسپارید:
container Container IOC بهار ، اشیاء (لوبیا) را ایجاد ، پیکربندی و مدیریت می کند.
✅ DI با تزریق وابستگی ، نیاز به کلمه کلیدی جدید را از بین می برد.
boot Boot Spring به طور خودکار قطعات را با استفاده از componentscan ثبت می کند.
✅ autowired برای تزریق استفاده می شود اما تزریق سازنده بهترین عمل است.