×

Cách triển khai Dependency Injection trong Java?

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