ฤดูใบไม้ผลิ - การฉีดขึ้นรูป
แอปพลิเคชันที่ใช้ Java ทุกตัวมีออบเจ็กต์สองสามชิ้นที่ทำงานร่วมกันเพื่อนำเสนอสิ่งที่ผู้ใช้ปลายทางเห็นว่าเป็นแอปพลิเคชันที่ใช้งานได้ เมื่อเขียนแอ็พพลิเคชัน Java ที่ซับซ้อนคลาสแอ็พพลิเคชันควรเป็นอิสระจากคลาส Java อื่น ๆ ให้มากที่สุดเพื่อเพิ่มความเป็นไปได้ในการนำคลาสเหล่านี้กลับมาใช้ใหม่และทดสอบโดยไม่ขึ้นกับคลาสอื่น ๆ ในขณะทดสอบยูนิต Dependency Injection (หรือบางครั้งเรียกว่าการเดินสาย) ช่วยในการเชื่อมคลาสเหล่านี้เข้าด้วยกันและในเวลาเดียวกันก็ทำให้พวกเขาเป็นอิสระ
พิจารณาว่าคุณมีแอปพลิเคชันที่มีส่วนประกอบของโปรแกรมแก้ไขข้อความและคุณต้องการตรวจสอบการสะกด รหัสมาตรฐานของคุณจะมีลักษณะดังนี้ -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
สิ่งที่เราทำที่นี่คือสร้างการพึ่งพาระหว่าง TextEditor และ SpellChecker ในสถานการณ์การควบคุมที่ผกผันเราจะทำสิ่งนี้แทน -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
ที่นี่ TextEditor ไม่ควรกังวลเกี่ยวกับการใช้งาน SpellChecker SpellChecker จะดำเนินการโดยอิสระและจะถูกส่งไปยัง TextEditor ในช่วงเวลาของการสร้างอินสแตนซ์ TextEditor ขั้นตอนทั้งหมดนี้ควบคุมโดย Spring Framework
ที่นี่เราได้ลบการควบคุมทั้งหมดออกจาก TextEditor และเก็บไว้ที่อื่น (เช่นไฟล์คอนฟิกูเรชัน XML) และการอ้างอิง (เช่นคลาส SpellChecker) จะถูกแทรกเข้าไปในคลาส TextEditor ผ่าน Class Constructor. ดังนั้นขั้นตอนการควบคุมจึงถูก "กลับด้าน" โดย Dependency Injection (DI) เนื่องจากคุณได้มอบหมายการพึ่งพาไปยังระบบภายนอกบางระบบอย่างมีประสิทธิภาพ
วิธีที่สองของการฉีดพึ่งพาคือผ่าน Setter Methodsของคลาส TextEditor ที่เราจะสร้างอินสแตนซ์ SpellChecker อินสแตนซ์นี้จะใช้เพื่อเรียกเมธอด setter เพื่อเริ่มต้นคุณสมบัติของ TextEditor
ดังนั้น DI จึงมีอยู่ในสองตัวแปรหลักและสองบทย่อยต่อไปนี้จะครอบคลุมทั้งสองอย่างด้วยตัวอย่าง -
ซีเนียร์ | ประเภทและคำอธิบายของการฉีดขึ้นอยู่กับที่ |
---|---|
1 | การฉีดขึ้นอยู่กับตัวสร้าง DI ที่ใช้คอนสตรัคเตอร์จะทำได้เมื่อคอนเทนเนอร์เรียกใช้คลาสคอนสตรัคเตอร์ที่มีอาร์กิวเมนต์จำนวนหนึ่งซึ่งแต่ละตัวแสดงถึงการพึ่งพาคลาสอื่น |
2 | การฉีดขึ้นอยู่กับตัวตั้งค่า DI ที่ใช้ Setter ทำได้โดยเมธอดการเรียกคอนเทนเนอร์บนถั่วของคุณหลังจากเรียกใช้ตัวสร้างที่ไม่มีอาร์กิวเมนต์หรือวิธีโรงงานแบบคงที่ไม่มีอาร์กิวเมนต์เพื่อสร้างอินสแตนซ์ bean ของคุณ |
คุณสามารถผสม DI ทั้งสองแบบ Constructor-based และ Setter-based DI ได้ แต่เป็นกฎง่ายๆในการใช้อาร์กิวเมนต์ตัวสร้างสำหรับการอ้างอิงที่จำเป็นและตัวตั้งค่าสำหรับการอ้างอิงที่เป็นทางเลือก
รหัสมีความสะอาดขึ้นด้วยหลักการ DI และการแยกส่วนจะมีประสิทธิภาพมากขึ้นเมื่อวัตถุมีการอ้างอิง วัตถุจะไม่ค้นหาการอ้างอิงและไม่ทราบตำแหน่งหรือคลาสของการอ้างอิง แต่ทุกอย่างจะได้รับการดูแลโดย Spring Framework