Mùa xuân - Tiêm phụ thuộc
Mỗi ứng dụng dựa trên Java đều có một vài đối tượng hoạt động cùng nhau để trình bày những gì người dùng cuối coi là một ứng dụng đang hoạt động. Khi viết một ứng dụng Java phức tạp, các lớp ứng dụng phải độc lập nhất có thể với các lớp Java khác để tăng khả năng sử dụng lại các lớp này và kiểm tra chúng độc lập với các lớp khác trong khi kiểm thử đơn vị. Dependency Injection (hay đôi khi được gọi là nối dây) giúp dán các lớp này lại với nhau và đồng thời giữ cho chúng độc lập.
Hãy xem xét bạn có một ứng dụng có thành phần soạn thảo văn bản và bạn muốn kiểm tra chính tả. Mã chuẩn của bạn sẽ trông giống như thế này -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}
Những gì chúng tôi đã làm ở đây là, tạo sự phụ thuộc giữa TextEditor và SpellChecker. Trong một kịch bản điều khiển đảo ngược, thay vào đó chúng tôi sẽ làm điều gì đó như thế này -
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
Ở đây, TextEditor không nên lo lắng về việc triển khai SpellChecker. SpellChecker sẽ được triển khai độc lập và sẽ được cung cấp cho TextEditor tại thời điểm khởi tạo TextEditor. Toàn bộ quy trình này được kiểm soát bởi Spring Framework.
Ở đây, chúng tôi đã xóa toàn bộ quyền kiểm soát khỏi TextEditor và giữ nó ở một nơi khác (tức là tệp cấu hình XML) và phần phụ thuộc (tức là lớp SpellChecker) đang được đưa vào lớp TextEditor thông qua một Class Constructor. Do đó, luồng kiểm soát đã bị "đảo ngược" bởi Dependency Injection (DI) vì bạn đã ủy quyền hiệu quả các phụ thuộc cho một số hệ thống bên ngoài.
Phương pháp tiêm phụ thuộc thứ hai là thông qua Setter Methodscủa lớp TextEditor nơi chúng ta sẽ tạo một phiên bản SpellChecker. Thể hiện này sẽ được sử dụng để gọi các phương thức setter để khởi tạo các thuộc tính của TextEditor.
Do đó, DI tồn tại trong hai biến thể chính và hai chương phụ sau đây sẽ bao gồm cả hai biến thể với các ví dụ:
Sr.No. | Mô tả & Loại tiêm phụ thuộc |
---|---|
1 | Chèn phụ thuộc dựa trên cấu trúc DI dựa trên phương thức xây dựng được thực hiện khi vùng chứa gọi một phương thức khởi tạo lớp với một số đối số, mỗi đối số đại diện cho một sự phụ thuộc vào lớp kia. |
2 | Tiêm phụ thuộc dựa trên setter DI dựa trên setter được thực hiện bằng cách vùng chứa gọi các phương thức setter trên bean của bạn sau khi gọi một phương thức khởi tạo không đối số hoặc phương thức nhà máy tĩnh không đối số để khởi tạo bean của bạn. |
Bạn có thể kết hợp cả hai, DI dựa trên Constructor và dựa trên Setter nhưng nguyên tắc chung là sử dụng các đối số của constructor cho các phụ thuộc bắt buộc và setter cho các phụ thuộc tùy chọn.
Mã rõ ràng hơn với nguyên tắc DI và việc tách sẽ hiệu quả hơn khi các đối tượng được cung cấp các phụ thuộc của chúng. Đối tượng không tra cứu các phụ thuộc của nó và không biết vị trí hoặc lớp của các phụ thuộc, thay vào đó mọi thứ đều do Spring Framework đảm nhận.