Tiêm phụ thuộc là gì? - Biết cách thực hiện tiêm phụ thuộc



Bài viết này về Dependency Injection là một hướng dẫn toàn diện về Dependency Injection với một bài thực hành trong Spring Boot.

Trong một thế giới mà chúng ta đang làm việc với các ngôn ngữ lập trình hàng ngày, tất cả chúng ta đều có xu hướng tìm kiếm các phương pháp và thủ thuật để giúp cuộc sống của chúng ta trở nên dễ dàng. Chà, Dependency Injection là một trong những kỹ thuật nhằm mục đích giúp mã nhà phát triển dễ dàng bằng cách cung cấp các phụ thuộc của một đối tượng khác. Trong bài viết này về Dependency Injection là gì, tôi sẽ giúp bạn hiểu chi tiết về kỹ thuật này.

Các chủ đề sau sẽ được đề cập trong bài viết này:





Vì vậy, hãy bắt đầu với bài viết này.

Dependency Injection là gì?

Dependency Injection là khả năng của một đối tượng cung cấp các phụ thuộc của một đối tượng khác.



Bây giờ, tôi khá chắc chắn, bạn có thể chưa hiểu gì về định nghĩa kỹ thuật trên. Vì vậy, hãy để tôi xóa nhầm lẫn cho bạn.

Khi bạn nghe đến thuật ngữ phụ thuộc, bạn nghĩ gì đến?

khung điều khiển từ khóa trong selen

Rõ ràng là dựa vào cái gì khác để hỗ trợ đúng không?



Điều đó cũng giống như vậy, trong trường hợp lập trình cũng vậy.

Sự phụ thuộc trong lập trình là một cách tiếp cận mà một lớp sử dụng các chức năng cụ thể của một lớp khác. Vì vậy, ví dụ: Nếu bạn xem xét hai lớp A và B, và nói rằng lớp A sử dụng các chức năng của lớp B, thì điều đó ngụ ý rằng lớp A có phụ thuộc của lớp B. Bây giờ, nếu bạn đang viết mã bằng Java thì bạn phải biết điều đó, bạn phảitạo một thể hiện của lớp B trước khi các đối tượng đang được lớp A sử dụng.

Các loại lớp - Tiêm phụ thuộc là gì - Edureka

Vì vậy, nếu bây giờ tôi phải xác định Dependency Injection cho bạn, thì quá trình tạo một đối tượng cho một số lớp khác và để cho lớp trực tiếp sử dụng phụ thuộc được gọi là Dependency Injection. Nó chủ yếu có ba lớp liên quan:

  • Lớp khách hàng: Đây là lớp phụ thuộc và phụ thuộc vào lớp Dịch vụ.

  • Hạng dịch vụ: Lớp này cung cấp một dịch vụ cho lớp khách hàng.

  • Loại đầu phun: Lớp này chịu trách nhiệm đưa đối tượng lớp dịch vụ vào lớp khách hàng

Bây giờ, bạn đã hiểu, Dependency Injection là gì, tiếp theo hãy để tôi hướng dẫn bạn qua nguyên tắc dựa trên Dependency Injection.

Đảo ngược kiểm soát

Như tôi đã đề cập ở trên Inversion of Control là một nguyên tắc dựa trên đó, Dependency Injection được thực hiện. Ngoài ra, như tên cho thấy, Inversion of Control về cơ bản được sử dụng để đảo ngược các loại trách nhiệm bổ sung khác nhau của một lớp chứ không phải là trách nhiệm chính.

Nếu tôi phải giải thích bạn bằng những thuật ngữ đơn giản hơn, thì hãy xem xét một ví dụ, trong đó bạn có khả năng nấu ăn. Theo nguyên tắc IoC, bạn có thể đảo ngược điều khiển, vì vậy thay vì bạn nấu thức ăn, bạn có thể trực tiếp đặt hàng từ bên ngoài, trong đó bạn nhận thức ăn ngay trước cửa nhà mình. Vì vậy, quá trình thực phẩm được giao cho bạn trước cửa nhà bạn được gọi là Quá trình Kiểm soát Đảo ngược.

Bạn không cần phải tự nấu ăn, thay vào đó, bạn có thể đặt đồ ăn và để nhân viên giao hàng, mang đồ ăn đến cho bạn. Bằng cách này, bạn không phải lo thêm trách nhiệm mà chỉ cần tập trung vào công việc chính.

Bây giờ, bạn đã biết nguyên tắc đằng sau Dependency Injection, hãy để tôi đưa bạn qua các loại Dependency Injection.

Các loại tiêm phụ thuộc

Chủ yếu có ba loại tiêm phụ thuộc:

  • Chèn ép: Trong kiểu tiêm này, bộ phun cung cấp sự phụ thuộc thông qua hàm tạo lớp khách hàng.

  • Setter Injection / Property Injection: Trong loại tiêm này, phương pháp kim tiêm tiêm phụ thuộc vào phương pháp setter mà khách hàng tiếp xúc.

  • Tiêm giao diện: Trong loại tiêm này, kim tiêm sử dụng Giao diện để cung cấp sự phụ thuộc vào lớp khách hàng. Máy khách phải triển khai một giao diện sẽ hiển thịphương pháp settercái nàochấp nhận sự phụ thuộc.

Cho đến bây giờ, tôi hy vọng bạn đã hiểu sự thật rằng Dependency Injection chịu trách nhiệm tạo các đối tượng, hiểu lớp nào yêu cầu các đối tượng đó và cuối cùng cung cấp các lớp đó với các đối tượng. Vì vậy, trên lưu ý đó, tiếp theo chúng ta hãy xem xét các lợi ích của Dependency Injection.

Lợi ích của tiêm phụ thuộc

Trước khi tôi liệt kê các lợi ích của Dependency Injection, hãy để tôi giải thích cho bạn sự cần thiết của việc tiêm này ở cấp độ ngành, để giúp bạn hiểu rõ hơn về những lợi ích.

Hãy xem xét một tình huống, trong đó bạn có một Lớp Email, có trách nhiệm duy nhất là chăm sóc các email nhận được. Bây giờ, lớp này sẽ có các đối tượng như “Tới địa chỉ email”, “Từ địa chỉ email”, “Chủ đề và Nội dung của email”.

Bây giờ, nếu công ty muốn lưu tin nhắn văn bản và âm thanh, bạn có nghĩ rằng lớp này có thể lưu tin nhắn không?

Chà, câu trả lời là không?

Đó là bởi vì, Lớp email không thể xử lý các tham số của văn bản và tin nhắn âm thanh. Trong những trường hợp như vậy, bạn sẽ phải tạo lại lớp. Bây giờ, việc tạo lại lớp là một công việc khá cồng kềnh, đặc biệt là nếu bạn phải thường xuyên. Thay vào đó, nếu bạn sử dụng Dependency Injection, bạn có thể thay đổi các đối tượng tại thời điểm chạy. Vì vậy, theo cách này, bạn không cần phải tạo lại lớp mà nó sẽ giúp bạn theo nhiều cách.

Vì vậy, nếu tôi phải tóm tắt những lợi ích của Dependency injection, thì sau đây là những lợi ích:

Được rồi, bây giờ bạn đã biết các lợi ích của Dependency Injection, hãy cùng chúng tôi tiếp tục và xem cách triển khai Dependency Injection bằng Spring Boot.

Làm thế nào để triển khai DI bằng Spring Boot?

Bước 1: Mở của bạn IDE Eclipse và tạo ra một Ứng dụng khởi động mùa xuân bằng cách nhấp chuột phải và chọn Dự án Spring Starter . Sau đó, đề cập đến tên của dự án và nhấp vào Hoàn thành .

Để có được Spring Starter Project, bạn phải cài đặt Spring Tool Suite từ Eclipse Marketplace. Trong trường hợp bạn chưa cài đặt Spring Too Suite, bạn có thể tham khảo bài viết của tôi trên .

Bạn sẽ tự động thấy rằng một tệp ứng dụng được tạo như bên dưới.

Bước 2: Tiếp theo, tạo một lớp trong cùng một gói. Để làm điều đó, hãy nhấp chuột phải vào tệp -> chọn Lớp học và đề cập đến tên lớp. Sau đó bấm vào Hoàn thành . Điều này sẽ tạo ra một Lớp học tập tin. Ở đây tôi đã tạo một lớp Khách hàng. Tham khảo bên dưới.

Bước 3: Sau đó, chúng ta hãy đặt một số thuộc tính cho lớp. Vì vậy, hãy để chúng tôi nói, chúng tôi bao gồm ID khách hàng, tên khách hàngTên khóa học. Đề cập đến đoạn mã dưới đây.

package com.example.demo // tên gói public class Khách hàng {private int custid private String custname private String coursename}

Bước 3.1: Sau khi hoàn thành việc đó, bạn phải tạo phương thức Getter và Setter cho các thuộc tính này. Để làm điều đó, hãy chọn các thuộc tính này và nhấp chuột phải. Sau đó chọn Nguồn -> Tạo phương thức Getter và Setter.

Mã của bạn cho đến bây giờ sẽ như sau:

package com.example.demo public class Khách hàng {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}}

Bây giờ, hãy xem xét một tình huống mà bạn phải tạo một đối tượng cho Khách hàng và bạn không muốn làm điều đó theo cách thủ công. Trong trường hợp như vậy, bạn sẽ phải sử dụng Dependency Injection, để lấy các đối tượng bất cứ khi nào bạn yêu cầu.

Vì vậy, tiếp theo chúng ta hãy xem xét cách chúng ta có thể đạt được điều tương tự.

Bước 4: Đầu tiên, hãy thay đổi Đường chạy bên trong tập tin lớp ứng dụng theo sau:

ConfigurableApplicationContext context = SpringApplication.run (DemoApplication.class, args)

Lưu ý: Nếu bạn gặp lỗi, hãy nhập nội dung sau:

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

Dòng mã trên sẽ trả về một đối tượng tại thời điểm thực thi. Bây giờ hãy thêm mã sau vào tệp ứng dụng.

khách hàng c = context.getBean (customer.class)

Dòng trên, sẽ yêu cầu trình biên dịch trả về một đối tượng của lớp khách hàng. Tham khảo bên dưới.

chuyển đổi một chuỗi thành ngày tháng trong java

Bước 4.1: Bây giờ, để kiểm tra xem nó có hoạt động hay không, bạn có thể quay lại lớp Khách hàng và thêm một phương thức như sau:

public void display () {System.out.println ('Đối tượng được trả về thành công')}

Phương thức này sẽ hiển thị đầu ra “Đối tượng được trả về thành công” khi thực hiện thành công.

Bước 4.2: Tiếp theo, bạn phải quay lại hồ sơ và đề cập đến những điều sau:

c.display ()

Qua đó, bạn đang gọi đối tượng của lớp Khách hàng với một tham chiếu của phương thức hiển thị. Tham khảo hình ảnh bên dưới để biết mã lớp Ứng dụng tính đến thời điểm hiện tại:

Bây giờ, nếu bạn thực hiện dự án, bạn sẽ thấy một ngoại lệ Không có loại đậu đủ tiêu chuẩn . Điều này là do lớp khách hàng mà bạn đã xác định không phải là Spring Bean, tức là không phải là Spring Object. Tham khảo bên dưới.

Bước 4.3: Vì vậy, để nói với Spring Container rằng, chúng ta cần một đối tượng của Lớp khách hàng. Để làm được điều đó, bạn cần đề cập đến Chú thích @Component , trong lớp Khách hàng. Mã trong lớp Khách hàng phải như sau:

package com.example.demo import org.springframework.stereotype.Component @Component public class Khách hàng {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} public void display () {System.out.println ('Đối tượng được trả về thành công')}}

Sau đó, khi bạn đề cập đến khách hàng c = context.getBean (customer.class) trình biên dịch sẽ kiểm tra xem có bean của khách hàng trong vùng chứa hay không.

Nếu Bean có sẵn, thì Spring framework sẽ đưa đối tượng khách hàng vào ứng dụng của bạn. Vì vậy, về cơ bản, đối tượng này được tạo bởi Spring framework, có thể được sử dụng thêm trong ứng dụng.

Vì vậy, Nếu tôi thực hiện dự án này ngay bây giờ, bạn sẽ thấy một kết quả là Đối tượng Trả về Thành công. Tham khảo bên dưới.

Về cơ bản đây là cách bạn có thể triển khai Dependency Injection.

Ví dụ: Chèn phụ thuộc bằng cách sử dụng chú thích tự động

Tôi hy vọng bạn đã hiểu cách hoạt động của Dependency Injection trong Spring Boot. Bây giờ, chúng ta hãy mở rộng ví dụ này và xem thêm cách một lớp phụ thuộc vào lớp kia đã sử dụng các chức năng của lớp đó trong Spring Boot như thế nào.

Bước 1: Tạo một cái mới tập tin lớp , một lần nữa nhấp chuột phải vào gói và bằng cách chọn Mới -> Đẳng cấp. Bây giờ, hãy đề cập đến tên của lớp như bên dưới và nhấp vào Hoàn thành.

Bước 2: Tiếp theo, chúng ta hãy đặt một số thuộc tính cho lớp. Vì vậy, hãy để chúng tôi nói, chúng tôi bao gồm TechID, Techname. Đề cập đến đoạn mã dưới đây.

package com.example.demo public class Technologies {private int techid private String techname}

Bước 2.1: Khi bạn đã hoàn thành việc đó, hãy tạo Phương pháp Getter và Setter cho các thuộc tính này bằng cách nhấp chuột phải vào tệp và sau đó chọn Nguồn -> Tạo phương thức Getter và Setter.

Bước 3: Bây giờ, chúng ta hãy nói, chúng ta phải tạo ra một phương pháp in “ Thành công “. Để làm điều đó, hãy đề cập đến mã:

public void tech () {System.out.println ('Thành công')}

Mã của bạn cho đến bây giờ sẽ giống như dưới đây:

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} public void setTechname (String techname) {this.techname = techname} public void tech () {System.out.println ('Thành công')}}

Bước 4: Bây giờ, để gọi phương pháp tech () bên trong hạng khách hàng , bạn phải tạo một đối tượng của lớp công nghệ. Vì vậy, hãy đề cập đến dòng mã sau trong lớp khách hàng:

công nghệ tư nhân techdetail

Bước 4.1: Khi bạn đã hoàn thành việc đó, hãy tạo Phương pháp Getter và Setter cho những thuộc tính này bởi nhấp chuột phải vào tệp và sau đó chọn Nguồn -> Tạo phương thức Getter và Setter.

Bước 5: Tiếp theo, để sử dụng phương pháp tech () , bạn phải đề cập đến techdetail.tech () phía dưới cái phương pháp hiển thị của lớp khách hàng . Ngoài ra, để đảm bảo rằng đối tượng techdetail được khởi tạo đề cập Chú thích @ComponentLớp công nghệ. Tham khảo bên dưới.

Bây giờ, khi bạn thực hiện dự án này, bạn sẽ thấy Null Pointer Exception . Điều này là bởi vì bây giờ Lớp khách hàng phụ thuộc vào lớp Công nghệ và chưa biết sự tồn tại của lớp Công nghệ .

Vì vậy, để cho phép Khách hàng nhận ra lớp Công nghệ, bạn phải chèn @ Chú thích không mong muốn trong lớp Khách hàng. Mã cuối cùng của lớp khách hàng của bạn phải như sau:

package com.example.demo import org.springframework.beans.factory.annotation.Autow Managed import org.springframework.stereotype.Component @Component public class Khách hàng {private int custid private String custname private String coursename @Autowored private Technologies techdetail public Technologies getTechdetail ( ) {return techdetail} public void setTechdetail (Technologies techdetail) {this.techdetail = techdetail} 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} public void display () {System.out.println ( 'Đối tượng được trả về thành công') techdetail.tech ()}}

Khi bạn thực thi các tệp này, bạn sẽ thấy các kết quả đầu ra là Đối tượng Trả về Thành công và Thành công, điều này ngụ ý rằng Sự phụ thuộc của chúng ta vào các lớp đã được đáp ứng. Tham khảo bên dưới.

Bây giờ bạn đã hoàn thành bài viết, hãy xem của Edureka, một công ty học trực tuyến đáng tin cậy với mạng lưới hơn 250.000 người học hài lòng trải dài trên toàn cầu.

Có một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần nhận xét của bài viết này “Dependency Injection là gì? ' bài báo và chúng tôi sẽ liên hệ lại với bạn trong thời gian sớm nhất.