Chào bạn, chắc hẳn bạn cảm thấy khó hiểu về Dependency Injection (DI) là gì đúng không? Có phải bạn không rõ khái niệm của nó trong lập trình? Tại sao chúng ta cần DI? Các loại DI có trong lập trình? Và cuối cùng là lợi ích khi sử dụng Dependency Injection.
Trước hết mình hãy phân tích từ Dependency (phụ thuộc) nghĩa là gì? Anh lấy ví dụ trong thực tế. Khi mình đi làm thì mình có thể dùng phương tiện di chuyển là xe máy để đến công ty. Như vậy để đạt được mục đích đến công ty thì anh phải bắt buộc có chiếc xe máy để hoàn thành nhiệm vụ của mình. Như vậy anh đang phụ thuộc vào chiếc xe máy để đạt được mục đích là đến công ty.
Tương tự như vậy trong lập trình, ví dụ anh viết một chức năng cho giáo viên có thể xem kết quả điểm thi của từng học sinh. Như vậy trong lớp giáo viên, anh phải có đối tượng sinh viên để anh có thể lấy được kết quả thi của bạn sinh viên đó. Như vậy lớp giáo viên phụ thuộc vào lớp sinh viên vì nếu không có đối tượng sinh viên được khai báo trong lớp giáo viên, thì giáo viên không thể lấy được điểm của sinh viên.
Ví dụ trong Java mình có lớp Student như sau. Gồm có tên (name), điểm thi (mark) và mình có phương thức getStudentMark() để lấy kết quả thi của sinh viên.
1
2
3
4
5
6
7
8
9
10
11
12
public class Student {
private String name;
private float mark;
public Student(){
}
public float getStudentMark() {
return mark;
}
}
Ví dụ chúng ta có lớp Teacher như sau. Gồm có tên và phương thức getStudentMark() để lấy ra điểm thi của Sinh Viên.
1
2
3
4
5
6
7
8
9
10
11
12
public class Teacher {
private String name;
private Student student;
public Teacher(){
student = new Student()
}
public float getStudentMark() {
return student.getStudentMark();
}
}
Như các bạn thấy trong lớp Teacher dòng số 6. Mình khai báo đối tượng Student trong lớp Teacher để mình có thể sử dụng được phương thức getStudentMark() phục vụ cho việc xem điểm của giáo viên.
Tiếp đến mình đi tìm hiểu khái niệm Injection là gì? Như các bạn thấy tại dòng số 6 của class Teacher. Để sử dụng được chức năng getStudentMark() trong đối tượng sinh viên thì mình phải sử dụng toán tử new để tạo ra đối tượng Student trước khi sử dụng các phương thức có trong Student. Vậy có thể hiểu Injection là mình giao cho một ai đó (ví dụ spring framework chẳng hạn) khởi tạo object và nhúng object đó và các Dependency đang dùng.
Nói cách khác, ở ví dụ trên mình giao cho framework (Spring) khởi tạo đối tượng Student và nhúng đối tượng Student vào đối tượng Teacher mà ta không cần dùng toán tử new mà giao cho Spring quản lý.
Có 3 cách để chúng ta có thể Dependency Injection (nhúng một object vào một object khác).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Teacher {
private Student student;
// Dựa vào constructor
Teacher (Student student) {
this.student = student;
}
// Dựa vào Setter method
void setStudent(Student student){
this.student = student;
}
}
Trong dự án Spring chúng ta có thể nhúng đối tượng Student vào đối tượng Teacher như sau.
1- Sử dụng XML configuration
1
2
3
4
<bean id="student" class="org.levunguyen.student" />
<bean id="teacher" class="org.levunguyen.teacher">
<constructor-arg name="item" ref="student" />
</bean>
2- Sử dụng Annotation @autowire.
1
2
3
4
public class Teacher {
@Autowired
private Student student;
}