Inversion of Control và Dependency Injection

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Trong bài viết trước chúng ta đã cùng tìm hiểu thế nào là Dependency Injection rồi, do đó trong bài viết này mình sẽ đi sâu về Inversion of Control (IoC) hơn, và tìm hiểu xem mối liên hệ giữa hai khái niệm này là như thế nào các bạn nhé!

Như mình đã nói, với Dependency Injection thì một đối tượng sẽ không phụ thuộc vào đối tượng khác và đối tượng khác cũng vậy. Khi cần đối tượng này sẽ gọi tới đối tượng kia và ngược lại. Và mình đã hỏi các bạn, các đối tượng sẽ được tạo ra và nằm ở đâu để khi cần chúng có thể gọi lẫn nhau. Câu trả lời là chúng ta phải có một khung chứa, và khung chứa đó chính là một phần của IoC.

  Hiểu về Dependency Injection
  SQL Injection là gì? Cách giảm thiểu và phòng ngừa SQL Injection

IoC có mục đích là cung cấp một cơ chế đơn giản để chứa các đối tượng phụ thuộc và quản lý các đối tượng phụ thuộc đó thông qua chu trình sống của chúng. Một đối tượng bị phụ thuộc sẽ yêu cầu một số lượng nhất định các đối tượng phụ thuộc được quản lý bởi IoCIoC sẽ cung cấp những cách để các đối tượng bị phụ thuộc có thể truy cập và tương tác được các đối tượng phụ thuộc.

IoC được phân chia thành hai loại khác nhau, đó là:

  • Dependency Lookup
  • Dependency Injection

và chúng sẽ có hai kiểu hiện thực khác nhau.

Dependency Lookup sẽ tìm kiếm đối tượng phụ thuộc trong khung chứa IoC và sau đó các bạn có thể dùng code để đưa đối tượng phụ thuộc vào trong đối tượng bị phụ thuộc trong khi đó Dependency Injection sẽ đưa luôn đối tượng phụ thuộc vào đối tượng bị phụ thuộc.

Đến đây chắc các bạn cũng có thể phân biệt được sự khác biệt giữa IoC và Dependency Injection rồi phải không? Bây giờ chúng ta sẽ cùng tìm hiểu thêm về các loại của IoC các bạn nhé!

Dependency Lookup

Dependency Lookup được chia thành hai kiểu khác nhau đó là:

  • Dependency Pull
  • Contextualized Dependency Lookup (CDL)

Với Dependency Pull, các đối tượng phụ thuộc sẽ được lấy ra từ một nơi mà các đối tượng phụ thuộc đã được đăng ký chứ không phải lấy trực tiếp từ khung chứa. Nếu các bạn đã làm việc qua với EJB thì các bạn đã làm quen với Dependency Pull vì để lấy các đối tượng phụ thuộc các bạn phải thông qua JNDI API.

Inversion of Control và Dependency Injection

Còn Contextualized Dependency Lookup thì việc lấy đối tượng phụ thuộc xảy ra trực tiếp với khung chứa luôn chứ không thông qua nơi mà đối tượng phụ thuộc đã đăng ký.

Inversion of Control và Dependency Injection

Dependency Injection

Dependency Injection cho chúng ta hai cách phổ biến để đưa đối tượng phụ thuộc vào đối tượng bị phụ thuộc đó là: Constructor Injection và Setter Injection.

Với Constructor Injection, việc đưa đối tượng phụ thuộc vào đối tượng bị phụ thuộc sẽ thông qua các constructor của đối tượng bị phụ thuộc. Khi đó đối tượng phụ thuộc sẽ là một tham số trong những constructor đó.

Ví dụ:

Còn với Setter Injection thì việc đưa đối tượng phụ thuộc sẽ thông qua một phương thức setter bên trong đối tượng bị phụ thuộc.

Ví dụ

package com.huongdanjava;
public class SetterInjection {
private Dependency dependency;
public void setDependency(Dependency dependency) {
this.dependency = dependency;
}
}