بهار-نت-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.
انواع تزریق وابستگی در بهار
(مرجع: اسناد بهار – تزریق وابستگی)
تزریق سازنده (توصیه شده)
وابستگی ها را از طریق سازنده تزریق کنید (بهترین تمرین).
@Component
public class PirateShip {
private final Captain captain;
@Autowired
public PirateShip(Captain captain) { // Injecting dependency via constructor
this.captain = captain;
}
}
بهترین برای وابستگی های اجباری.
ناپذیری را تضمین می کند (زمینه های نهایی).
تزریق تنظیم کننده
وابستگی ها را از طریق روش های تنظیم کننده تزریق کنید.
@Component
public class PirateShip {
private Captain captain;
@Autowired
public void setCaptain(Captain captain) { // Setter-based injection
this.captain = captain;
}
}
برای وابستگی های اختیاری خوب است.
می تواند منجر به اشیاء قابل تغییر (ایمن تر) شود.
تزریق میدانی (توصیه نمی شود)
فیلدهای مستقیم تزریق با استفاده از
@Autowired
بشر
@Component
public class PirateShip {
@Autowired
private Captain captain;
}
یک عمل بد در نظر گرفته شده است زیرا:
- آزمایش سخت تر (هیچ راهی برای عبور از مسخره در تست ها نیست).
- تغییر ناپذیری (حالت کلاس را تغییر می دهد).
بهترین تمرین: هر زمان ممکن است از تزریق سازنده استفاده کنید!
پروژه دستی: IOC و DI در عمل
مرحله 1: یک پروژه بوت بهار ایجاد کنید
به Spring Initializr بروید
انتخاب کنید:
- نسخه بوت بهار: آخرین پایدار
- وابستگی ها: وب بهار
-
بسته بندی: jar
کلیک کنید تولید کردن و پرونده 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 برای تزریق استفاده می شود اما تزریق سازنده بهترین عمل است.