Dependency injection (DI) là kỹ thuật truyền (inject) các phụ thuộc từ bên ngoài vào một class hoặc component thay vì để nó tự tạo, giúp source code dễ test, dễ mở rộng và ít phụ thuộc hơn.
Vấn đề trước khi có Dependency Injection
class Engine {
void start() {
System.out.println("Engine started");
}
}
class Car {
private Engine engine = new Engine(); // tạo trực tiếp ở đây
void drive() {
engine.start();
System.out.println("Car is moving");
}Giả sử ta có 2 class Car và Engine như trên, ở đây ta thấy Car tự tạo ra Engine, nghĩa là Car phụ thuộc chặt chẽ (tightly coupled) vào Engine. Nếu sau này muốn đổi sang ElectricEngine thì ta phải sửa trong class Car, rất khó mở rộng.
Dùng Dependency Injection
Thay vì Car tự tạo ra Engine, ta truyền (inject) Engine từ bên ngoài vào.
class Engine {
void start() {
System.out.println("Engine started");
}
}
class Car {
private Engine engine;
// Inject qua constructor
Car(Engine engine) {
this.engine = engine;
}
void drive() {
engine.start();
System.out.println("Car is moving");
}
}
public class Main {
public static void main(String[] args) {
Engine engine = new Engine();
Car car = new Car(engine); // inject dependency
car.drive();
}
}Bây giờ Car không còn tự tạo ra Engine nữa, nó chỉ cần biết rằng nó có một Engine nào đó, miễn là có hàm start().
Các cách inject dependency
- Constructor injection → phổ biến nhất
- Setter injection
- Interface injection