0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hướng dẫn Tự Viết Annotation @Autowired Giống Như Spring Boot trong Spring IoC Container

Đăng vào 3 ngày trước

• 3 phút đọc

Giới thiệu về Dependency Inversion, Dependency Injection và Inversion of Control

Trong lĩnh vực phát triển phần mềm, ba khái niệm quan trọng mà bạn cần nắm vững là Dependency Inversion, Dependency Injection, và Inversion of Control. Nhưng bạn có chắc chắn rằng mình hiểu rõ về chúng? Bạn có tự tin áp dụng ba nguyên tắc này để xây dựng một thư viện tương tự như Spring Boot không?

Bài viết này sẽ tập trung vào các tính năng cơ bản của Spring, đặc biệt là Spring IoC Container và quản lý Bean. Mục tiêu là giúp bạn hiểu rõ hơn về cách mà IoC container hoạt động, cũng như cách tự viết một cái @Autowired đơn giản.

1. Dependency Inversion

Dependency Inversion là một nguyên tắc trong lập trình hướng đối tượng giúp giảm sự phụ thuộc giữa các lớp. Đây là nội dung rất được quan tâm, thường là trái tim của các framework như Spring. Tuy nhiên, số lượng người nắm rõ cách thức nó hoạt động thực sự lại khá ít. Hãy cùng phân tích sâu hơn nhé.

1.1 Vấn đề

Giả sử bạn đang làm việc tại một công ty thích sản xuất iPhone nhưng không tự sản xuất linh kiện. Tất cả các linh kiện đều được nhập từ bên ngoài:

  • Màn hình từ Samsung hoặc LG.
  • Pin từ Remax hoặc Pisen.
  • Chip từ Intel hoặc Samsung.

Ở đây, iPhone sẽ trở thành sản phẩm cuối cùng, còn những linh kiện là các đối tượng phụ thuộc (dependency). Trong lập trình, chúng ta cũng nên tách rời các lớp và làm cho chúng phụ thuộc vào các interface thay vì các lớp cụ thể.

Cụ thể, giả thiết chúng ta có các lớp RamCpu bên dưới. Nếu không khởi tạo chúng, bạn sẽ gặp trường hợp Null Pointer Exception (NPE).

java Copy
class Ram {
    private String producer;
    private String specification;
}

class Cpu {
    private String producer;
    private String specification;
}

class SmartPhone {
    private Ram ram;
    private Cpu cpu;
}

1.2 Giải pháp

Để giải quyết vấn đề trên, chúng ta cần một cách để khởi tạo các đối tượng này mà không cần phải thay đổi mã nguồn nhiều lần. Soluce là sử dụng Dependency Injection, tức là việc khởi tạo các dependency bên ngoài của đối tượng và sau đó ‘tiêm’ chúng vào trong đối tượng.

Chúng ta có thể viết lại lớp SmartPhone như sau:

java Copy
class SmartPhone {
    private Ram ram;
    private Cpu cpu;

    public SmartPhone(Ram ram, Cpu cpu) {
        this.ram = ram;
        this.cpu = cpu;
    }
}

Như vậy, chúng ta có thể dễ dàng thay đổi giá trị của các dependency này mà không cần phải thay đổi phần mã chính.

1.3 Inversion of Control (IoC)

Inversion of Control là khái niệm nơi mà việc khởi tạo các đối tượng không được thực hiện bởi chính nó mà bởi một phần khác, thường là một framework. Spring IoC container giúp chúng ta thực hiện việc này dễ dàng hơn.

Thay vì phải tự khởi tạo đối tượng SmartPhone, Spring IoC container sẽ tự thực hiện điều đó và ‘tiêm’ các dependency mà chúng ta đã định nghĩa trước đó.

2. Thực hành

Chúng ta sẽ tạo một IoC container đơn giản bằng cách xây dựng ba annotation gần giống như Spring: @Component, @PostConstruct, và @Autowired. Chương trình này sẽ tự động tìm kiếm và khởi tạo các đối tượng cần thiết, sau đó inject vào các bean đã được định nghĩa.

Lớp ContextLoader sẽ thực hiện việc này. Dưới đây là phác thảo phương thức hoạt động của nó:

  • Tìm kiếm tất cả các lớp có annotation @Component.
  • Tạo mới cho các lớp đó và lưu trữ vào một bản đồ.
  • Thiết lập các dependency đã được inject và gọi các phương thức có @PostConstruct nếu có.

Hãy tham khảo mã nguồn và tiến hành thử nghiệm để hiểu rõ hơn về cách tự phát triển một IoC container đơn giản cho riêng bạn. Chúc bạn thành công!

Kết luận

Vậy là bạn đã có cái nhìn tổng quan về Dependency Inversion, Dependency Injection, và Inversion of Control. Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về các khái niệm này và làm quen với việc xây dựng một IoC container tương tự như Spring.
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào