Dependency Injection คืออะไร? - รู้วิธีการใช้ Dependency Injection

บทความนี้เกี่ยวกับ Dependency Injection คือคำแนะนำที่ครอบคลุมเกี่ยวกับ Dependency Injection ด้วย Hands-On ใน Spring Boot

ในโลกที่เราทำงานกับภาษาโปรแกรมในแต่ละวันพวกเราทุกคนมักจะค้นหาวิธีการและกลเม็ดเพื่อทำให้ชีวิตของเราง่ายขึ้น Dependency Injection เป็นหนึ่งในเทคนิคดังกล่าวที่มีจุดมุ่งหมายเพื่อช่วยให้โค้ดของนักพัฒนาทำได้อย่างง่ายดายโดยให้การอ้างอิงของวัตถุอื่น ในบทความเรื่อง Dependency Injection คืออะไรฉันจะช่วยให้คุณเข้าใจเทคนิคนี้โดยละเอียด



หัวข้อต่อไปนี้จะกล่าวถึงในบทความนี้:



เริ่มจากบทความนี้กันเลย

Dependency Injection คืออะไร?

Dependency Injection คือความสามารถของวัตถุในการจัดหาการอ้างอิงของวัตถุอื่น



ตอนนี้ฉันค่อนข้างแน่ใจว่าคุณอาจไม่เข้าใจอะไรเลยจากคำจำกัดความทางเทคนิคข้างต้น ดังนั้นฉันขอเคลียร์ความสับสนให้คุณ

เมื่อคุณได้ยินคำว่าการพึ่งพาอาศัยกันคุณคิดอย่างไร?

วิธีแปลง double เป็น int

เห็นได้ชัดว่าบางสิ่งต้องอาศัยสิ่งอื่นเพื่อสนับสนุนใช่ไหม?



เช่นเดียวกันในกรณีของการเขียนโปรแกรมก็เช่นกัน

การพึ่งพาการเขียนโปรแกรมเป็นแนวทางที่คลาสใช้ฟังก์ชันเฉพาะของคลาสอื่น ตัวอย่างเช่นหากคุณพิจารณาสองคลาส A และ B และบอกว่าคลาส A ใช้ฟังก์ชันของคลาส B แสดงว่าคลาส A มีการพึ่งพาคลาส B ตอนนี้ถ้าคุณเขียนโค้ดใน Java คุณต้องรู้ ที่คุณต้องสร้างอินสแตนซ์ของคลาส B ก่อนที่คลาส A จะใช้อ็อบเจ็กต์

ประเภทของชั้นเรียน - การฉีดพึ่งพาคืออะไร - Edureka

ดังนั้นถ้าตอนนี้ฉันต้องกำหนด Dependency Injection ให้คุณแล้วกระบวนการสร้างออบเจ็กต์สำหรับคลาสอื่น ๆ และปล่อยให้คลาสใช้การอ้างอิงโดยตรงเรียกว่า Dependency Injection. ส่วนใหญ่มีสามคลาสที่เกี่ยวข้อง:

  • คลาสไคลเอนต์: นี่คือคลาสที่ขึ้นอยู่กับและขึ้นอยู่กับคลาสบริการ

  • ชั้นบริการ: คลาสนี้ให้บริการกับคลาสไคลเอนต์

  • คลาสหัวฉีด: คลาสนี้มีหน้าที่ในการฉีดอ็อบเจ็กต์คลาสบริการลงในคลาสไคลเอนต์

ตอนนี้คุณเข้าใจแล้วว่า Dependency Injection คืออะไรต่อไปผมจะนำคุณไปสู่หลักการที่ใช้ Dependency Injection

การผกผันของการควบคุม

ดังที่ฉันได้กล่าวไปแล้วข้างต้น Inversion of Control เป็นหลักการที่ใช้ Dependency Injection ตามชื่อที่แนะนำโดยทั่วไปแล้ว Inversion of Control จะใช้เพื่อเปลี่ยนความรับผิดชอบเพิ่มเติมประเภทต่างๆของชั้นเรียนแทนที่จะเป็นความรับผิดชอบหลัก

ถ้าฉันต้องอธิบายคุณในแง่ที่ง่ายกว่านั้นให้พิจารณาตัวอย่างซึ่งคุณมีความสามารถในการปรุง ตามหลักการ IoC คุณสามารถเปลี่ยนการควบคุมได้ดังนั้นแทนที่จะทำอาหารคุณสามารถสั่งจากภายนอกได้โดยตรงโดยคุณจะรับอาหารที่หน้าประตูบ้านของคุณ ดังนั้นกระบวนการส่งอาหารถึงคุณที่หน้าประตูบ้านของคุณจึงเรียกว่า Inversion of Control

คุณไม่ต้องปรุงเอง แต่สามารถสั่งอาหารและให้ผู้บริหารจัดส่งส่งอาหารให้คุณได้ ด้วยวิธีนี้คุณไม่ต้องดูแลความรับผิดชอบเพิ่มเติมและเพียงแค่มุ่งเน้นไปที่งานหลัก

ตอนนี้คุณรู้หลักการเบื้องหลัง Dependency Injection แล้วผมขอนำคุณผ่านประเภทของ Dependency Injection

ประเภทของ Dependency Injection

ส่วนใหญ่มีสามประเภทของ Dependency Injection:

  • การฉีดตัวสร้าง: ในการฉีดประเภทนี้หัวฉีดจะให้การพึ่งพาผ่านตัวสร้างคลาสไคลเอนต์

  • Setter Injection / การฉีดคุณสมบัติ: ในการฉีดประเภทนี้วิธีการฉีดจะฉีดการพึ่งพาวิธีการเซ็ตเตอร์ที่ลูกค้าเปิดเผย

  • การฉีดอินเทอร์เฟซ: ในการฉีดประเภทนี้หัวฉีดใช้อินเทอร์เฟซเพื่อให้การพึ่งพาคลาสไคลเอนต์ ไคลเอนต์ต้องใช้อินเทอร์เฟซที่จะแสดงไฟล์วิธีการตั้งค่าที่ยอมรับการพึ่งพา

จนถึงตอนนี้ฉันหวังว่าคุณจะเข้าใจความจริงที่ว่า Dependency Injection มีหน้าที่สร้างวัตถุเข้าใจว่าคลาสใดต้องการอ็อบเจ็กต์เหล่านั้นและในที่สุดก็ให้คลาสเหล่านั้นกับอ็อบเจ็กต์ ดังนั้นในบันทึกดังกล่าวให้เราพิจารณาประโยชน์ของ Dependency Injection ต่อไป

ประโยชน์ของ Dependency Injection

ก่อนที่ฉันจะระบุประโยชน์ของ Dependency Injection ให้ฉันอธิบายให้คุณทราบถึงความจำเป็นในการฉีดยานี้ในระดับอุตสาหกรรมเพื่อช่วยให้คุณเข้าใจถึงประโยชน์ที่ดีขึ้น

พิจารณาสถานการณ์ซึ่งคุณมีคลาสอีเมลซึ่งมีหน้าที่รับผิดชอบ แต่เพียงผู้เดียวในการดูแลอีเมลที่ได้รับ ตอนนี้ชั้นเรียนนี้จะมีออบเจ็กต์เช่น 'ถึงที่อยู่อีเมล' 'จากที่อยู่อีเมล' 'หัวเรื่องและเนื้อหาของอีเมล'

ตอนนี้ถ้า บริษัท ต้องการบันทึกข้อความและข้อความเสียงคุณคิดว่าชั้นเรียนนี้สามารถบันทึกข้อความได้หรือไม่?

คำตอบคือไม่?

นั่นเป็นเพราะคลาสอีเมลไม่สามารถจัดการกับพารามิเตอร์ของข้อความและข้อความเสียงได้ ในกรณีเช่นนี้คุณจะต้องสร้างชั้นเรียนใหม่ ตอนนี้การสร้างชั้นเรียนใหม่เป็นงานที่ค่อนข้างยุ่งยากโดยเฉพาะอย่างยิ่งถ้าคุณต้องทำอย่างสม่ำเสมอ แต่ถ้าคุณใช้ Dependency Injection คุณสามารถเปลี่ยนวัตถุในขณะทำงานได้ ด้วยวิธีนี้คุณไม่จำเป็นต้องสร้างชั้นเรียนขึ้นมาใหม่ซึ่งจะช่วยคุณได้หลายวิธี

ดังนั้นหากต้องสรุปประโยชน์ของ Dependency injection ประโยชน์ต่อไปนี้คือ:

เอาล่ะตอนนี้คุณรู้ถึงประโยชน์ของ Dependency Injection แล้วให้เราก้าวต่อไปและดูวิธีใช้ Dependency Injection โดยใช้ Spring Boot

วิธีการติดตั้ง DI โดยใช้ Spring Boot

ขั้นตอนที่ 1: เปิดไฟล์ Eclipse IDE และสร้างไฟล์ แอปพลิเคชัน Spring Boot โดยคลิกขวาและเลือก โครงการ Spring Starter . จากนั้นระบุชื่อโครงการและคลิกที่ เสร็จสิ้น .

ในการรับ Spring Starter Project คุณต้องติดตั้ง Spring Tool Suite จาก Eclipse Marketplace ในกรณีที่คุณไม่ได้ติดตั้ง Spring Too Suite คุณสามารถอ้างอิงบทความของฉันได้ที่ .

คุณจะเห็นโดยอัตโนมัติว่ามีการสร้างไฟล์แอปพลิเคชันดังต่อไปนี้

ขั้นตอนที่ 2: จากนั้นสร้างคลาสในแพ็คเกจเดียวกัน โดยคลิกขวาที่ไฟล์ -> เลือก คลาส และพูดถึง ชื่อชั้น จากนั้นคลิกที่ เสร็จสิ้น . สิ่งนี้จะสร้างไฟล์ คลาส ไฟล์. ฉันได้สร้างคลาสลูกค้าแล้ว ดูด้านล่าง

ขั้นตอนที่ 3: หลังจากนั้นให้เราใส่คุณสมบัติบางอย่างสำหรับคลาส ดังนั้นให้เราพูดว่าเรารวม รหัสลูกค้าชื่อลูกค้า และ ชื่อหลักสูตร. พูดถึงรหัสด้านล่าง

แพ็คเกจ com.example.demo // ชื่อแพ็กเกจคลาสสาธารณะลูกค้า {private int custid private String custname private String Coursename}

ขั้นตอนที่ 3.1: เมื่อคุณทำเสร็จแล้วคุณจะต้อง สร้างวิธี Getter และ Setter สำหรับคุณสมบัติเหล่านี้ โดยเลือกคุณสมบัติเหล่านี้แล้วคลิกขวา จากนั้นเลือก ที่มา -> สร้างวิธี Getter และ Setter

รหัสของคุณจนถึงตอนนี้ควรเป็นดังนี้:

package com.example.demo public class ลูกค้า {private int custid private String custname private String Coursename public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } โมฆะสาธารณะ setCustname (String custname) {this.custname = custname} public String getCoursename () {return Coursename} โมฆะสาธารณะ setCoursename (String Coursename) {this.coursename = Coursename}}

ตอนนี้ให้พิจารณาสถานการณ์ที่คุณต้องสร้างออบเจ็กต์สำหรับลูกค้าและคุณไม่ต้องการทำด้วยตนเอง ในสถานการณ์เช่นนี้คุณจะต้องใช้ Dependency Injection เพื่อรับวัตถุเมื่อใดก็ตามที่คุณต้องการ

ต่อไปให้เรามาดูกันว่าเราจะบรรลุเป้าหมายเดียวกันได้อย่างไร

ขั้นตอนที่ 4: ขั้นแรกให้เปลี่ยนไฟล์ วิ่งบรรทัด ใน ไฟล์คลาสแอปพลิเคชัน ดังต่อไปนี้:

ConfigurableApplicationContext บริบท = SpringApplication.run (DemoApplication.class, args)

หมายเหตุ: หากคุณได้รับข้อผิดพลาดในการนำเข้าสิ่งต่อไปนี้:

import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.context.ConfigurableApplicationContext

บรรทัดโค้ดด้านบนนี้จะส่งคืนอ็อบเจ็กต์ในขณะดำเนินการ เพิ่มรหัสต่อไปนี้ลงในไฟล์แอปพลิเคชัน

ลูกค้า c = context.getBean (customers.class)

บรรทัดด้านบนจะบอกให้คอมไพเลอร์ส่งคืนอ็อบเจ็กต์ของคลาสลูกค้า ดูด้านล่าง

6 วิธีในการใช้คีย์เวิร์ดนี้มีอะไรบ้าง

ขั้นตอนที่ 4.1: ตอนนี้เพื่อตรวจสอบว่าใช้งานได้หรือไม่คุณ สามารถกลับไปที่คลาสลูกค้าได้ และเพิ่มวิธีการดังต่อไปนี้:

การแสดงโมฆะสาธารณะ () {System.out.println ('Object Returned Successfully')}

วิธีนี้จะแสดงผลลัพธ์“ Object Returned Successfully” เมื่อดำเนินการสำเร็จ

ขั้นตอนที่ 4.2: ถัดไปคุณต้องกลับไปที่ไฟล์แอปพลิเคชันและพูดถึงสิ่งต่อไปนี้:

c.display ()

ด้วยวิธีนี้คุณกำลังเรียกออบเจ็กต์ของคลาสลูกค้าด้วยการอ้างอิงของวิธีการแสดงผล อ้างถึงภาพด้านล่างสำหรับรหัสของคลาสแอปพลิเคชันจนถึงปัจจุบัน:

ตอนนี้หากคุณดำเนินการโครงการคุณจะเห็นไฟล์ ยกเว้นถั่วชนิดไม่มีคุณสมบัติ . เนื่องจากคลาสลูกค้าที่คุณกำหนดไว้ไม่ใช่ Spring Bean นั่นคือไม่ใช่ Spring Object ดูด้านล่าง

ขั้นตอนที่ 4.3: ดังนั้นเพื่อบอก Spring Container ว่าเราต้องการวัตถุของคลาสลูกค้า ในการทำเช่นนั้นคุณต้องพูดถึงไฟล์ คำอธิบายประกอบ @ ส่วนประกอบ ในคลาสลูกค้า รหัสในคลาสลูกค้าควรเป็นดังนี้:

package com.example.demo import org.springframework.stereotype.Component @Component public class ลูกค้า {private int custid private String custname private String Coursename public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname} public void setCustname (String custname) {this.custname = custname} public String getCoursename () {return Coursename} public void setCoursename (String Coursename) {this.coursename = Coursename} โมฆะสาธารณะ display () {System.out.println ('Object Returned Successfully')}}

จากนั้นเมื่อคุณพูดถึงลูกค้า c = context.getBean (customers.class) คอมไพเลอร์จะตรวจสอบว่ามีถั่วของลูกค้าอยู่ในคอนเทนเนอร์หรือไม่

หาก Bean พร้อมใช้งานกรอบงาน Spring จะฉีดวัตถุของลูกค้าในแอปพลิเคชันของคุณ โดยพื้นฐานแล้ววัตถุนี้ถูกสร้างขึ้นโดย Spring framework ซึ่งสามารถใช้เพิ่มเติมในแอปพลิเคชันได้

ดังนั้นถ้าฉันดำเนินการโครงการนี้ตอนนี้คุณจะเห็นผลลัพธ์ว่า Object Returned Successfully ดูด้านล่าง

โดยพื้นฐานแล้วคุณสามารถใช้ Dependency Injection ได้อย่างไร

ตัวอย่าง: Dependency Injection โดยใช้ Autowired Annotation

ฉันหวังว่าคุณจะเข้าใจวิธีการทำงานของ Dependency Injection ใน Spring Boot ตอนนี้ให้เราขยายตัวอย่างนี้และดูเพิ่มเติมว่าคลาสที่ขึ้นอยู่กับคลาสอื่น ๆ ใช้ฟังก์ชันของคลาสนั้นใน Spring Boot อย่างไร

ขั้นตอนที่ 1: สร้างไฟล์ ไฟล์คลาส โดยอีกครั้ง คลิกขวาที่แพ็คเกจ และโดยการเลือก ใหม่ -> คลาส ตอนนี้ระบุชื่อชั้นเรียนด้านล่างแล้วคลิกที่ เสร็จสิ้น.

ขั้นตอนที่ 2: ต่อไปให้เราใส่คุณสมบัติบางอย่างสำหรับคลาส ดังนั้นให้เราพูดว่าเรารวม TechID, Techname พูดถึงรหัสด้านล่าง

แพคเกจ com.example.demo เทคโนโลยีคลาสสาธารณะ {private int techid private String techname}

ขั้นตอนที่ 2.1: เมื่อคุณทำเสร็จแล้วให้สร้าง วิธี Getter และ Setter สำหรับคุณสมบัติเหล่านี้โดยคลิกขวาที่ไฟล์จากนั้นเลือก ที่มา -> สร้างเมธอด Getter และ Setter

ขั้นตอนที่ 3: ตอนนี้สมมติว่าเราต้องสร้างวิธีการที่พิมพ์ ' ประสบความสำเร็จ “. ในการทำเช่นนั้นกล่าวถึงรหัส:

โมฆะสาธารณะ tech () {System.out.println ('สำเร็จ')}

รหัสของคุณจนถึงตอนนี้ควรมีลักษณะดังนี้:

package com.example.demo public class Technologies {private int techid private String techname public int getTechid () {return techid} public void setTechid (int techid) {this.techid = techid} public String getTechname () {return techname} โมฆะสาธารณะ setTechname (String techname) {this.techname = techname} public void tech () {System.out.println ('Successful')}}

ขั้นตอนที่ 4: ตอนนี้โทร วิธีการ tech () ใน ระดับลูกค้า คุณต้องสร้างวัตถุของคลาสเทคโนโลยี ดังนั้นให้ระบุบรรทัดรหัสต่อไปนี้ในคลาสลูกค้า:

เทคโนโลยีส่วนตัว techdetail

ขั้นตอนที่ 4.1: เมื่อคุณทำเสร็จแล้วให้สร้าง วิธี Getter และ Setter สำหรับคุณสมบัติเหล่านี้โดย คลิกขวาที่ไฟล์ แล้วเลือก ที่มา -> สร้างเมธอด Getter และ Setter

ขั้นตอนที่ 5: ถัดไปเพื่อใช้ไฟล์ วิธีการ tech () คุณต้องพูดถึง techdetail.tech () ภายใต้ วิธีการแสดงของคลาสลูกค้า . นอกจากนี้เพื่อให้แน่ใจว่าวัตถุ techdetail เป็นอินสแตนซ์ที่กล่าวถึง คำอธิบายประกอบ @ ส่วนประกอบ คือ คลาสเทคโนโลยี ดูด้านล่าง

ตอนนี้เมื่อคุณดำเนินการโครงการนี้คุณจะเห็นไฟล์ ข้อยกเว้นของตัวชี้ Null . เนื่องจากตอนนี้ คลาสของลูกค้าขึ้นอยู่กับคลาสเทคโนโลยีและยังไม่ทราบว่ามีคลาสเทคโนโลยีอยู่ .

ดังนั้นเพื่อให้ลูกค้าสามารถจดจำคลาสเทคโนโลยีได้คุณต้องแทรกไฟล์ @ คำอธิบายประกอบอัตโนมัติ ในคลาสลูกค้า รหัสสุดท้ายของคลาสลูกค้าของคุณควรเป็นดังนี้:

แพคเกจ com.example.demo นำเข้า org.springframework.beans.factory.annotation นำเข้าอัตโนมัติ org.springframework.stereotype.Component @Component public class ลูกค้า {private int custid private String custname private String Coursename @Autowired private Technologies techdetail public Technologies getTechdetail ( ) {return techdetail} โมฆะสาธารณะ setTechdetail (Technologies techdetail) {this.techdetail = techdetail} public int getCustid () {return custid} public void setCustid (int custid) {this.custid = custid} public String getCustname () {return custname } โมฆะสาธารณะ setCustname (String custname) {this.custname = custname} public String getCoursename () {return Coursename} โมฆะสาธารณะ setCoursename (String Coursename) {this.coursename = Coursename} การแสดงโมฆะสาธารณะ () {System.out.println ( 'คืนวัตถุสำเร็จ') techdetail.tech ()}}

เมื่อคุณเรียกใช้ไฟล์เหล่านี้คุณจะเห็นผลลัพธ์เป็น Object Returned Successfully และ Successful ซึ่งหมายความว่าการพึ่งพาคลาสของเราได้รับการเติมเต็มแล้ว ดูด้านล่าง

ตอนนี้คุณทำบทความเสร็จแล้วให้ตรวจสอบไฟล์ โดย Edureka บริษัท การเรียนรู้ออนไลน์ที่เชื่อถือได้ซึ่งมีเครือข่ายผู้เรียนที่พึงพอใจมากกว่า 250,000 คนกระจายอยู่ทั่วโลก

มีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นของ“ Dependency Injection คืออะไร? ” บทความ และเราจะติดต่อกลับโดยเร็วที่สุด