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
Related
- OOP — ต้องเข้าใจก่อน (interface, polymorphism)
- IoC Container — กลไกที่ Spring ใช้จัดการ DI
- Spring — DI คือหัวใจของ Spring
- Spring Boot — Spring แบบง่ายพร้อม auto-DI
- Framework — framework มักบังคับใช้ DI pattern