Learn Java Spring: Lesson 2 DI and IOC
Đầu tiên, Spring Framework là gì? Chắc hẳn những bạn đang tìm hiểu Spring đều đọc hoặc nghe từ đâu đó về khái niệm Spring FrameWork. Ví dụ như ở đây , loạt bài hướng dẫn này hướng dẫn bạn cách cài đặt và chạy chương trình với Spring.
Bài viết này của tôi không phải là một bài hướng dẫn hoặc guide về Spring. Vì vậy tôi sẽ không đi sâu vào các khái niệm JSP/Servlets, EJB/IoC container, etc. Thay vào đó là 2 khái niệm quan trọng và cơ bản nhất của Spring DI and IOC
Trước hết: Spring Framework là một công cụ phát triển cao cấp dựa trên 2 kỹ thuật phổ biến nhất mà người đọc thường quên hay không chú ý đến
1) POJOs - Plain Old Java Objects, mà tôi đã nhắc đến trong bài viết trước ở đây
2) Và những công nghệ như EJB, JSP, Servlets, JMS …
1.Inversion of control (IOC)
Inversion of control hay viết tắc của IOC đó chính là khả năng của Spring container trong việc quản lý các thành phần, khi mà thay vì một thành phần phải tự đòi hỏi các tài nguyên cho nó, thì nó sẽ được Spring container cung cấp các tài nguyên dựa vào thông tin trong file cấu hình.
I. Khái niệm DEPENDENCY INJECTION (DI).
Dependency Injection là khái niệm của Spring được đựa trên nguyên lý Dependency Inversion(Solid)
Có thể hiểu Dependency Injection một cách đơn giản như sau:
-
Các module không giao tiếp trực tiếp với nhau, mà thông qua interface. Module cấp thấp sẽ implement interface, module cấp cao sẽ gọi module cấp thấp. Ví dụ: Để giao tiếp với database, ta có interface IDatabase, các module cấp thấp là XMLDatabase, SQLDatabase. Module cấp cao là CustomerBusiness sẽ sử dụng interface IDatabase.
-
Việc khởi tạo các module cấp thấp sẽ do DI Container thực hiện. Ví dụ: Trong module CustomerBusiness, ta sẽ không khởi tạo IDatabase db = new XMLDatabase(), việc này sẽ do DI Container thực hiện. Module CustomerBusiness sẽ không biết gì về module XMLDatabase hay SQLDatabase.
-
Việc Module nào gắn với interface nào sẽ được config trong code hoặc trong file XML.
-
DI được dùng để làm giảm sự phụ thuộc giữa các module, dễ dàng hơn trong việc thay đổi module, bảo trì code và testing.
Dependency Injection có thể được tạo bằng 3 cách.
- Qua Constructor
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}
- Qua các setter/getter
private SpellChecker spellChecker;
// a setter method to inject the dependency.
public void setSpellChecker(SpellChecker spellChecker) {
System.out.println("Inside setSpellChecker." );
this.spellChecker = spellChecker;
}
// a getter method to return spellChecker
public SpellChecker getSpellChecker() {
return spellChecker;
}
- Qua Interface
interface InjectPerson {
public void injectHere(Person p);
}
class Company implements InjectPerson {
Person injectedPerson;
public void injectHere(Person p) {
this.injectedPerson = p;
}
}
Còn tiếp!