เมื่อเอเจนต์ภายนอกทำการแก้ไขการพึ่งพาโดยเอเจนต์ภายนอกมากกว่าตัวคลาสเอง จะเรียกว่าการฉีดการพึ่งพา มีสองวิธีมาตรฐานของการฉีดพึ่งพาที่ได้รับการสนับสนุนในกรอบงาน Spring ผ่านอาร์กิวเมนต์ตัวสร้างหรือโดยใช้วิธีตัวตั้งค่า การฉีดพึ่งพาแบบเดิมเรียกว่าการฉีดคอนสตรัคเตอร์และแบบหลังเรียกว่าการฉีดเซ็ตเตอร์ ทั้งสองวิธีนี้ใช้เพื่อวัตถุประสงค์ที่แตกต่างกันและมีข้อดีและข้อเสียของตัวเอง
การฉีดคอนสตรัคเตอร์เทียบกับการฉีดเซตเตอร์
ความแตกต่างระหว่างการฉีด Constructor และ Setter Injection คือ การฉีด Constructor ใช้ Constructor และในทางกลับกัน setter Injection จะใช้วิธี setter เพื่อฉีดการพึ่งพา วิธีการฉีดทั้งสองประเภทนี้แตกต่างกันโดยพิจารณาจากพารามิเตอร์หลายอย่าง เช่น ความปลอดภัย การอ่านได้ สนับสนุนการไม่เปลี่ยนรูป และอื่นๆ
การฉีดคอนสตรัคเตอร์เป็นการฉีดการพึ่งพาประเภทหนึ่งในเฟรมเวิร์กสปริงที่ใช้คอนสตรัคเตอร์เพื่อฉีดการพึ่งพา การพึ่งพาที่จำเป็นสำหรับคลาสใด ๆ จะถูกระบุเป็นพารามิเตอร์ของตัวสร้างของคลาสนั้น ๆ Constructor Injection ไม่อนุญาตให้นักพัฒนาสร้างอ็อบเจกต์ใดๆ เว้นแต่ว่าการพึ่งพาทั้งหมดจะพร้อม และด้วยเหตุนี้ จึงมั่นใจได้ว่าการฉีดการพึ่งพาจะประสบความสำเร็จ
การฉีด Setter เป็นการฉีดการพึ่งพาประเภทหนึ่งในเฟรมเวิร์กสปริงที่ใช้เมธอด setter เพื่อฉีดการพึ่งพา มันมีเมธอด setter ของฟอร์ม setXXX() โดยที่ XXX หมายถึงการพึ่งพาที่ฉีดออบเจ็กต์ที่ขึ้นต่อกันเข้าไปในไคลเอนต์ วิธีการแก้ไขการพึ่งพานี้พบได้บ่อยมากในเฟรมเวิร์กสปริง
ตารางเปรียบเทียบระหว่าง Constructor Injection และ Setter Injection
พารามิเตอร์ของการเปรียบเทียบ | คอนสตรัคเตอร์ ฉีด | เซ็ตเตอร์ฉีด |
พึ่งพาฉีด | มันใช้ตัวสร้าง | มันใช้วิธีการตั้งค่า |
ความสามารถในการอ่าน | ไม่สามารถอ่านได้มากเมื่อเทียบกับ setter | มันน่าอ่านมากขึ้น |
แทนที่คุณสมบัติ | ไม่สามารถแทนที่การพึ่งพา | สามารถแทนที่การพึ่งพาบางอย่างได้ |
การเปลี่ยนแปลง | มันสร้างอินสแตนซ์ bean ใหม่เสมอ | ไม่ได้สร้างอินสแตนซ์ bean ใหม่ |
ไม่เปลี่ยนรูป | รองรับการไม่เปลี่ยนรูป | มันไม่รองรับ |
Constructor Injection คืออะไร?
การฉีด Constructor เป็นหนึ่งในวิธีมาตรฐานในการแก้ไขการพึ่งพาภายในกรอบงาน Spring ซึ่งกำหนดรายการการพึ่งพาที่จำเป็นสำหรับคลาสแบบคงที่โดยกำหนดสิ่งเหล่านั้นเป็นพารามิเตอร์ให้กับตัวสร้างของคลาส คลาสทั้งหมดที่ต้องการการพึ่งพาจะต้องมีตัวสร้างสาธารณะอยู่ภายใน ซึ่งใช้อินสแตนซ์เป็นอาร์กิวเมนต์ของตัวสร้าง และตัวสร้างนั้นจำเป็นต้องเป็นตัวสร้างสาธารณะเพียงตัวเดียวในคลาสนั้น
หากจำเป็นต้องมีการพึ่งพามากกว่าหนึ่งรายการ อาร์กิวเมนต์เพิ่มเติมควรถูกเพิ่มไปยังคอนสตรัคเตอร์เดียวกัน เพื่อให้แน่ใจว่าการพึ่งพาถูกฉีดเข้าไปอย่างสมบูรณ์ ควรปฏิบัติตามหลักการความรับผิดชอบเดียว ซึ่งระบุว่าสมาชิกควรทำสิ่งเดียวเท่านั้น ตัวสร้างควรปราศจากตรรกะอื่นใด เพื่อให้ตัวสร้างของคลาสเร็วขึ้นและเชื่อถือได้มากขึ้น
ข้อเท็จจริงที่สำคัญประการหนึ่งของการฉีดคอนสตรัคเตอร์คืออ็อบเจ็กต์จะไม่ถูกสร้างขึ้นเว้นแต่ว่าการพึ่งพาทั้งหมดจะพร้อม เนื่องจากมันสร้างอินสแตนซ์ใหม่ทุกครั้งที่มีการเรียก Constructor ดังนั้นจึงไม่สามารถแทนที่ได้ โดยทั่วไปแล้วการฉีด Constructor จะใช้ในกรณีที่มีความจำเป็นในการสร้างวัตถุที่มีการพึ่งพาทั้งหมด นี่เป็นวิธีที่ใช้ได้โดยทั่วไปและง่ายที่สุดในการนำการขึ้นต่อกันไปใช้อย่างถูกต้อง
การฉีด Setter คืออะไร?
Setter injection เป็นหนึ่งในวิธีมาตรฐานในการแก้ไขการพึ่งพาภายในกรอบงาน Spring ซึ่งใช้เมธอด setter เพื่อแก้ไขการขึ้นต่อกัน เมธอด setter อยู่ในรูปแบบ setXXX() โดยที่ XXX ระบุการขึ้นต่อกันที่จำเป็นต้องฉีด ในวิธีการฉีดประเภทนี้ ขั้นแรก สร้างอ็อบเจ็กต์ และต่อมา มีการฉีดการพึ่งพา สำหรับการกำหนดค่า Spring จะใช้ไฟล์ XML ดังนั้นความสามารถในการอ่านจึงเป็นข้อกังวลใหญ่
เนื่องจากเมธอด setter มีรูปแบบชื่อเมธอดที่ระบุ จึงช่วยเพิ่มความสามารถในการอ่านได้หลายวิธี เมื่อมีความจำเป็นต้องฉีดการอ้างอิงจำนวนมากขึ้น ประเภทการฉีดเซ็ตเตอร์จึงเป็นที่นิยมและเป็นที่ต้องการมากกว่าวิธีการฉีดประเภทอื่นๆ นอกจากนั้น โดยใช้ setter injection นักพัฒนาสามารถแทนที่และเปลี่ยนค่าได้อย่างง่ายดาย เนื่องจากไม่ได้สร้าง bean Instance ใหม่ทุกครั้ง ข้อเสียเปรียบเพียงประการเดียวของการฉีด setter คือไม่รับประกันว่าจะมีการฉีดสารที่พึ่งพาได้อย่างสมบูรณ์
ไม่มีการรับประกันว่าวัตถุบางอย่างมีการพึ่งพาการฉีดหรือไม่ กล่าวอีกนัยหนึ่ง หมายความว่าอาจมีอ็อบเจ็กต์ที่มีการพึ่งพาที่ไม่สมบูรณ์ การฉีด Setter เป็นวิธีที่ยืดหยุ่นที่สุดและเป็นวิธีที่พบได้บ่อยที่สุดในการนำการพึ่งพาการฉีดไปใช้
ความแตกต่างหลักระหว่าง Constructor Injection และ Setter Injection
บทสรุป
สิ่งที่สำคัญที่สุดคือการฉีดการพึ่งพาทั้งสองวิธีปล่อยให้เป็นการฉีดคอนสตรัคเตอร์หรือการฉีดเซ็ตเตอร์มีข้อดีและข้อเสียของตัวเอง นอกจากนั้น Spring ไม่ได้ละเว้นนักพัฒนาจากการใช้ใครก็ตามนอกจากผู้ประเมิน พวกเขามีอิสระที่จะใช้ทั้งการฉีดคอนสตรัคเตอร์และการฉีดเซ็ตเตอร์ในไฟล์คอนฟิกูเรชัน Spring ไฟล์เดียว สิ่งสำคัญที่ควรคำนึงถึงขณะฉีดการพึ่งพาคือการใช้ Constructor Injection เมื่อมีความจำเป็นที่จำเป็นในการสร้างวัตถุที่มีการพึ่งพาทั้งหมด และใช้ setter Injection เมื่อจำนวนการขึ้นต่อกันมากขึ้นหรือหากมีความจำเป็นที่ดีขึ้น ความสามารถในการอ่าน
อ้างอิง
- https://digitalcommons.calpoly.edu/csse_fac/34/
- https://books.google.com/books?hl=th&lr=&id=InfRDwAAQBAJ&oi=fnd&pg=PA63&dq=constructor+injection&ots=Hon_bCw-Kv&sig=VdsD_S0lCfP3D8idI8q4F6RnhoE