Dependency Injection (DI)

Design pattern ที่ “ส่ง” dependency จากข้างนอกเข้าไปใน class แทนที่จะให้ class สร้างเอง

เปรียบเทียบ: เหมือนถุงมือธานอส — ถุงมือ (class) ต้องมี Infinity Stone (dependency) ครบทุกเม็ดถึงจะดีดนิ้วได้ ถ้าขาดหินเม็ดไหน ถุงมือก็ดีดนิ้วไม่ได้ — เหมือน class ที่ขาด dependency จะทำงานไม่ครบ

Infinity Stone แต่ละเม็ด = dependency ที่มีความสามารถเฉพาะตัว:

  • 🟣 Power Stone → พลังทำลายล้างมหาศาล ทำลายได้ทั้งดาวเคราะห์
  • 🔵 Space Stone → เปิดประตูมิติ เทเลพอร์ตไปที่ไหนก็ได้ในจักรวาล
  • 🔴 Reality Stone → บิดเบือนความเป็นจริง เปลี่ยนสิ่งรอบตัวได้ตามใจ
  • 🟡 Mind Stone → ควบคุมจิตใจผู้อื่น เพิ่มพลังสมอง (อยู่บนหน้าผาก Vision)
  • 🟢 Time Stone → ควบคุมเวลา ย้อน หยุด หรือกรอเวลาได้
  • 🟠 Soul Stone → ควบคุมวิญญาณ มีโลกมิติของตัวเอง (Soul World)

ถุงมือ = class หลัก / Infinity Stone แต่ละเม็ด = dependency ที่ถูก inject เข้ามา ใส่ไม่ครบ → ดีดนิ้วไม่ได้ → class ทำงานไม่สมบูรณ์

ไม่ใช้ DI vs ใช้ DI

// ไม่ใช้ DI — class สร้าง dependency เอง (ผูกแน่น)
public class Gauntlet {
    private Stone stone = new TimeStone(); // Hard-coded
}
 
// ใช้ DI — inject จากข้างนอก (ยืดหยุ่น)
public class Gauntlet {
    private final Stone stone;
    public Gauntlet(Stone stone) { this.stone = stone; }
}
// จะ inject หินเม็ดไหนก็ได้:
new Gauntlet(new TimeStone());
new Gauntlet(new PowerStone());

ข้อดี

  • เปลี่ยน dependency ง่าย — อยากเปลี่ยนก็แค่ส่งตัวใหม่เข้ามา
  • Test ง่าย — ส่ง mock dependency เข้าไปแทนของจริงได้
  • ลด coupling — class ไม่ต้องรู้ว่า dependency สร้างยังไง

DI ในแต่ละภาษา

ภาษา / Frameworkเครื่องมือ DIวิธีการ
Java + Spring Boot@Autowired / IoC Containerอัตโนมัติ — Spring หาให้เอง

จุดสำคัญ

  • ต้องเข้าใจ OOP ก่อน (interface, class)
  • Spring / Spring Boot ใช้ DI เป็นหัวใจหลักผ่าน IoC Container
  • OOP — ต้องเข้าใจก่อน (interface, polymorphism)
  • IoC Container — กลไกที่ Spring ใช้จัดการ DI
  • Spring — DI คือหัวใจของ Spring
  • Spring Boot — Spring แบบง่ายพร้อม auto-DI
  • Framework — framework มักบังคับใช้ DI pattern