Implement 1 interface và dùng @autowire gọi interface đó thì thuộc loại Dependency Injection nào?

Chào các tiền bối , em có học qua phần các loại Dependency Injection thấy có 3 loại :
image

Em có tham khảo code và dùng code có thiết kế như sau :
+> Class UserServiceImpl sẽ Implement Interface UserService , và chỉ có các hàm override của interface
image
+> Dùng @Autowire để DI bean tự động vào UserService, gọi class implement qua interface UserService

Em có thấy người ta ghi là loại 1 hay dùng nhất mà em thấy khá khó hiểu , em hay dùng cách thiết kế bên trên để code thấy khá nhanh và dễ hiểu, dễ quản lí và em thấy có vẻ mình đang dùng loại DI số 3 là tiêm bean bằng interface phải không ạ ?

Các anh cho em hỏi là dùng cách này thì thuộc loại DI nào trong 3 loại DI trên ạ , em cảm ơn

2 Likes

Kiểu bạn hay dùng là loại 2 nhé.
Loại 1 tương tự loại 2, nhưng cần khai báo ở constructor
Loại 3 là chính là bạn phải viết phần inject 1 cách thủ công. Tức là tự set property cho object

7 Likes

Thường loại 1 dùng chung với Lombok như này cho gọn.

@RequiredArgsConstructor
public class UserController {
    private final UserService userService;
    // ...
}
3 Likes


đây là class interface ạ, chỉ dùng để định nghĩa hàm không có hàm setter getter ấy anh

cách em làm không có hàm setter getter ạ, có mỗi interface viết hàm định nghĩa(thêm ,sửa, xóa,…) và class con implement lại interface và override lại các hàm định nghĩa đó ,em thấy cách anh khác cách của em là của em dùng @autowire trong controller còn của anh chỉ cần khai báo @RequiredArgsConstructor phải không ạ

Uh, Lombok nó tự generate constructor dựa theo annotation rồi

1 Like

của em không dùng lombok và không có hàm constructor nên em chưa phân loại được cách của em thuộc loại DI nào ạ ::frowning:

theo định nghĩa kia thì loại 2 vẫn cần có setter đúng không ạ, nhưng cả interface và class implement của em đều không dùng lombok hay có hàm setter ạ , nên em mới chưa phân biệt được ấy anh

Cách em dùng là field injection. Spring recomdend dùng contructor hoặc setter. bởi vi dễ viết unitest. Cách em làm khó viết unitest. mặc dù nó đẹp hơn.

3 Likes

vậy thì mình vẫn nên sử dụng cách thông dụng nhất là cách 1 là constructor hơn là cách 2 sử dụng setter phải không ạ

1 Like

Đúng rồi em dùng consturtor

2 Likes

Field injection không nhất thiết phải có setter. Cách của bạn nó thuộc về tổ chức code không liên quan đến DI

4 Likes

Cậu có thể dùng reflection để set dependency mà không cần setter. Vì cậu đã dùng annotation để đánh dấu các component và nơi nó sẽ được “wire”, DI container có thể lấy tất cả các class được đánh dấu và thực hiện khởi tạo component - inject dependency một cách tự động.

Đó là cách mà spring DI container làm.

P/s: tớ không rõ source cậu đọc về DI, cơ mà nó có vẻ không đáng tin cậy :smile:

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?