Sự khác nhau giữa AUTOWIRE và CONSTRUCTOR Injection trong Spring Java

Mình muốn hỏi mọi người để thảo luận về vấn đề này. Đôi lúc mình thấy nó không khác biệt nhau lắm.
Nhưng mình thấy use autowire sẽ tiện lợi và ngắn gọn hơn là dùng Contructor injection khi có có nhiều repositoy được khai báo. Ai có thể cho mk biết thêm sự khác biệt lớn của nó là gì không.

Hi Sơn đẹp trai,
Tớ có 1 câu hỏi trước dành cho cậu. Về câu mà cậu nói dưới đây:

Điều này có nghĩa là cậu thấy nó hơi khác biệt chút. Cậu có thể liệt kê những khác biệt mà cậu thấy không?

3 Likes

Nếu bạn siêng năng và chăm chỉ, thì 2 cách như nhau.
Nếu bạn lười, thì nó lại là vấn đề đáng cân nhắc. :v

2 Likes

Theo mình nghĩ Constructor Injection “tốt hơn” vì lý do dễ test hơn.

Nếu bạn tạo ra Object để test, và bạn có Constructor với tất cả những Dependencies mà Class cần, thì bạn không thể nào mà quên set Dependency được. Thay vì đó nếu bạn dùng Field Injection thì lúc tạo ra Object, bạn còn phải set mỗi cái Dependency từng cái một, và nếu quên, thì sẽ có NullPointerException.

Tóm lại là Constructor cho mình biết phải dùng Class như nào, làm cho Code mình rất dễ hiểu. Nếu bạn cảm thấy phải viết Code nhiều quá, thì bạn nên tham khảo lombok nhé.

Bạn muốn đọc thêm thì tham khảo trang nay nhé:
http://olivergierke.de/2013/11/why-field-injection-is-evil/

2 Likes

t thấy khác biệt ở đây là dùng autowire nó ngắn gọn . trong khi dùng contructor thì nó dài, và nếu mk gọi nhiều repository mà mk khai báo trong contructor rất là khó nhìn . Mk muốn hỏi ở đây là nguyên lí hoạt động của nó khác nhau nhiều hay ko và hiệu năng nó như thế nào

lombok mk vẫn dùng. nhưng mk chưa hiểu nguyên lí của th autowire và contructor nó khác nhau như thế nào. vì mk dùng th autowire thấy code ngắn đi rất nhiều khi sử dụng repository. còn nếu sd contructor , inject 1-2 repo thì ko sao nhưng gỉả sử 20 or hơn nó rất là khó nhìn :3 . Mk cảm ơn bạn đã giải thích cho mk.

Hm, tớ hiểu rồi. Cậu nên đề cập tới việc này từ đầu :slight_smile:
Như cậu thấy, @Autowrite là annotation, đồng nghĩa với việc thao tác dependency injection sẽ được xử lý bởi Spring framework. Cách implement nhìn chung của họ là sử dụng reflection để inject các phụ thuộc ở runtime -> cậu chỉ biết được việc insert thành công không khi chạy chương trình. Việc sử dụng reflection sẽ đảm bảo cho implementation generic.
Tuy nhiên, việc sử dụng reflection có 1 side effect nữa, đó là performance penalty. Tuy nhiên, nó cũng không tới mức “rất chậm”, và đồng thời cũng chỉ chạy vào lúc khởi tạo chương trình, vậy nên điều này hoàn toàn chấp nhận được.

Sử dụng constructor, tớ nghĩ không cần giải thích thêm nữa. Điểm trừ của nó, như cậu đã đề cập ở dưới đây:

Nhìn chung, nếu cậu sử dụng Spring framework, cậu nên sử dụng annotation. Nó sẽ làm code của cậu dễ đọc hơn, đỡ tốn effort để implement -> reduce engineering cost, đồng thời dễ thay đổi hơn.

3 Likes

Mình đã nói rồi, nó chỉ là vấn đề giữa siêng năng và lười biếng thôi. Gặp đứa siêng năng thì dù có injection 100 cái đi nữa nó vẫn đọc. :v

Còn muốn nghiêm túc hơn thì có thuật ngữ Convention over Configuration.

2 Likes

Mình chỉ muốn bổ sung thêm là nếu class bạn có 20 Dependency thì đây mới là vấn đề :slightly_smiling_face: Đó là một dấu hiệu class bạn có quá nhiều nhiệm vụ.

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