Dependency Injection và Inversion of Control

Dependency Injection và Inversion of Control là thành phần chủ chốt và nền tảng quan trọng tạo nên sức mạnh của Spring. Tất cả đều hướng đến một mục đích duy nhất là tạo ra ứng dụng ít kết dính và dễ mở rộng.

Hai trong số những thành phần chủ chốt và nền tảng quan trọng tạo nên sức mạnh của Spring chính là Inversion of Control (IoC) và Dependency Injection (DI). Áp dụng DI và IoC sẽ giúp ứng dụng ít kết dính (loosely coupling), dễ mở rộng (flexibility).

1. Dependency Injection

Trước khi tìm hiểu về Dependency Injection thì chúng ta hãy điểm lại về Dependency Inversion Principle.

Dependency Injection và Inversion of Control

Dependency Inversion Principle (nguyên lý đảo ngược sự phụ thuộc) là nguyên lý cuối cùng trong SOLID. SOLID là năm nguyên lý cơ bản trong thiết kế phần mềm hướng đối tượng giúp mã nguồn trở nên dễ hiểu, linh động và dễ bảo trì. Tác giả của SOLID là kỹ sư phần mềm Robert C. Martin.

Nội dung nguyên lý Dependency Inversion Principle được phát biểu như sau:

  • Các lớp cấp cao (high-level) không nên phụ thuộc vào các lớp cấp thấp (low-level) mà cả hai nên phụ thuộc vào lớp trừu tượng (abstraction).
  • Các lớp sẽ giao tiếp với nhau thông qua Interface, không phải thông qua Implementation.

Dependency Injection (tiêm chích phụ thuộc) là một mẫu thiết kế (Design Pattern) được sử dụng để loại bỏ sự phụ thuộc giữa các thành phần, giúp cho việc quản lý và kiểm thử ứng dụng dễ dàng, làm cho mã chương trình ít bị phụ thuộc vào nhau hơn.

Dependency Injection cung cấp cho một đối tượng các thể hiện phụ thuộc của nó từ bên ngoài truyền vào mà không phải khởi tạo trực tiếp từ trong lớp thông qua Constructor, Setter, Fields, Interface.

Dependency Injection và Inversion of Control

2. Inversion of Control

Inversion of Control (đảo ngược điều khiển) tuân theo DIP. IoC giúp làm thay đổi luồng điều khiển của ứng dụng, nhằm tăng tính mở rộng của một hệ thống.

Dependency Injection và Inversion of Control

Inversion of Control sẽ có một Container lưu trữ các Implementation của các Abstraction muốn truyền vào high-level. Khi nào high-level cần dùng thì nó sẽ tìm trong Container với instance tương ứng và inject vào high-level.

Có nhiều cách để hiện thực IoC như Service Locator, Event, Dependency Injection…

Dependency Injection và Inversion of Control

3. Spring Container

Trong Spring, Spring Container sẽ tạo các đối tượng, lắp ráp chúng lại với nhau, cấu hình và quản lý vòng đời của chúng từ lúc khởi tạo cho đến lúc bị hủy.

Spring Container sử dụng DI để quản lý các thành phần, đối tượng. Những thành phần, đối tượng được quản lý bởi Spring Container được gọi là Spring Bean.

Dependency Injection và Inversion of Control

Spring Container (đại diện là ApplicationContext) sau khi nạp các POJO sẽ kết hợp với Configuration Metadata (thông qua XML, Annotation) để khởi tạo, cấu hình và lắp ráp các Bean. Lúc này, ứng dụng được cấu hình đầy đủ và có thể thực thi được.

Dependency Injection và Inversion of Control

Spring Container bao gồm hai loại là BeanFactory và ApplicationContext:

  • ApplicationContext được extends từ Interface BeanFactory nhưng BeanFactory chỉ cung cấp những tính năng cơ bản còn ApplicationContext sẽ thêm một số chức năng khác nâng cao hơn như i18n, ApplicationEvent…
  • BeanFactory và ApplicationContext đều cung cấp khả năng lấy đối tượng trong Spring Container bằng phương thức getBean(). Nhưng BeanFactory chỉ tạo ra đối tượng chúng ta cần khi gọi phương thức getBean() còn ApplicationContext sẽ tạo hết tất cả các đối tượng ngay khi gọi đến Spring Container.

Lời kết: Trong thời gian tới Tech Finally sẽ tiếp tục ra mắt nhiều nội dung khác liên quan đến Spring miễn phí đến bạn đọc, các bạn nhớ theo dõi kênh để có được những chia sẻ mới nhất.

(Tác giả: Truong Duong)

Bình luận