برنامه نویسی

📌 بهار-نت-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 برای تزریق استفاده می شود اما تزریق سازنده بهترین عمل است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا