Dependency Injection (DI) là một kỹ thuật trong lập trình hướng đối tượng để giảm thiểu sự phụ thuộc cứng (hard-coded dependencies) giữa các thành phần, làm cho chúng dễ dàng thay đổi và quản lý hơn. DI thường được thực hiện thông qua một "container" mà tự động chăm sóc việc tạo đối tượng và "tiêm" chúng vào nơi cần thiết. Dưới đây là cách cơ bản để triển khai DI trong Java:
Xác định các Interface
Đầu tiên, xác định các interface cho các thành phần hoặc dịch vụ mà bạn muốn tiêm. Điều này giúp giảm sự phụ thuộc vào cài đặt cụ thể và làm cho mã của bạn linh hoạt hơn.
public interface MessageService {
void sendMessage(String message, String recipient);
}
Tạo Cài Đặt Cụ Thể
Sau đó, tạo cài đặt cụ thể cho các interface này. Đây là các thành phần hoặc dịch vụ thực tế mà bạn sẽ sử dụng trong ứng dụng của mình.
public class EmailService implements MessageService {
public void sendMessage(String message, String recipient) {
// Logic để gửi email
}
}
Tiêm Phụ Thuộc
Tiếp theo, thay vì khởi tạo các phụ thuộc (dependencies) một cách trực tiếp bên trong các lớp sử dụng chúng, bạn "tiêm" chúng thông qua constructor hoặc setter.
Tiêm qua Constructor:
public class Application {
private MessageService messageService;
public Application(MessageService service) {
this.messageService = service;
}
public void processMessages(String message, String recipient) {
this.messageService.sendMessage(message, recipient);
}
}
Tiêm qua Setter:
public class Application {
private MessageService messageService;
public void setMessageService(MessageService service) {
this.messageService = service;
}
public void processMessages(String message, String recipient) {
this.messageService.sendMessage(message, recipient);
}
}
Sử Dụng DI Container
Trong một ứng dụng lớn hoặc khi sử dụng một framework như Spring, bạn thường sẽ sử dụng một DI container. Container này tự động tạo và tiêm các phụ thuộc dựa trên cấu hình, giúp quản lý sự phụ thuộc trở nên dễ dàng hơn.
Ví dụ với Spring, bạn có thể định nghĩa các bean và phụ thuộc của chúng trong một file cấu hình XML hoặc sử dụng annotations:
Sử dụng Annotations trong Spring:
@Service
public class EmailService implements MessageService {
// implementation
}
@Controller
public class MyApplication {
private MessageService messageService;
@Autowired
public MyApplication(MessageService messageService) {
this.messageService = messageService;
}
// methods
}
Trong ví dụ trên, Spring container sẽ tự động tạo một instance của EmailService
và tiêm nó vào MyApplication
khi khởi tạo đối tượng MyApplication
.
Dependency Injection giúp tạo ra các ứng dụng dễ dàng thay đổi, mở rộng và bảo trì bằng cách giảm sự phụ thuộc chặt chẽ giữa các thành phần.
Comments