Bean autowiring trong Spring là gì?

Bản chất của Spring là tạo ra các đối tượng trong container của nó để khi các bạn cần thì có thể gọi đến đối tượng bạn cần. Vì thế, Spring tìm mọi cách để hỗ trợ chúng ta có thể tạo ra đối tượng trong khung chứa của nó một cách dễ dàng nhất.

Chúng ta đã biết cách khai báo để đưa đối tượng này vào đối tượng khác, hay có thể nói là đưa đối tượng phụ thuộc vào đối tượng bị phụ thuộc, bằng cách sử dụng thuộc tính ref, list … Ngoài ra, Spring còn hỗ trợ chúng ta đưa đối tượng phụ thuộc vào đối tượng bị phụ thuộc một cách tự động bằng cách sử dụng Bean Autowiring của nó.

Với Bean Autowiring, chúng ta ko cần phải sử dụng các thuộc tính ref hay list, mà chỉ cần viết code tuân thủ theo quy tắc của Spring thì đối tượng phụ thuộc sẽ tự động được đưa vào đối tượng bị phụ thuộc.

Có ba cách để sử dụng Bean Autowiring, đó là:

  • byName
  • byType
  • constructor

Để các bạn có thể hiểu rõ hơn, mình sẽ làm một ví dụ nhé! Trong ví dụ này mình sẽ yêu cầu Spring tự động đưa đối tượng Table vào đối tượng Room của mình. Cụ thể như sau:

Bean autowiring trong Spring là gì?

Mình sẽ sử dụng Java 17 cho ứng dụng ví dụ này:

Spring dependency như sau:

Class Room:

Class Table:

Class Application:

Và khai báo đối tượng Table và Room trong tập tin cấu hình của Spring:

OK, giờ mình sẽ đi lần lượt từng cách một và nói cho các bạn biết cụ thể về nó nhé!


byName

Như các bạn đã biết, mỗi bean trong Spring container đều có 1 id của riêng nó. Dựa vào điều này, Spring quy định nếu id của đối tượng phụ thuộc (trong ví dụ của mình là đối tượng Table) giống với tên một biến nào đó trong đối tượng bị phụ thuộc (đối tượng Room) và khi khai báo đối tượng bị phụ thuộc, chúng ta khai báo thêm thuộc tính autowire=”byName” thì Spring sẽ tự động đưa đối tượng phụ thuộc vào đối tượng bị phụ thuộc qua phương thức setter của đối tượng bị phụ thuộc.

Trong ví dụ của mình, id của đối tượng Table đã hoàn toàn giống với tên biến table trong đối tượng Room, do đó chúng ta chỉ cần khai báo thêm cho bean room thuộc tính autowire=”byName” thì Spring sẽ tự động đưa đối tượng Table vào đối tượng Room cho chúng ta.

Cấu hình của đối tượng Room sẽ sửa lại như sau:

Khi chạy, chương trình sẽ cho ra kết quả như sau:

Bean autowiring trong Spring là gì?

Cách này có bất lợi ở chỗ nếu sau này chúng ta thay đổi tên biến của đối tượng bị phụ thuộc, lại phải đi đổi lại tên id của đối tượng phụ thuộc trong khung chứa của Spring và ngược lại. Các bạn hình dung được chứ nhỉ?


byType

Cách này chúng ta chỉ áp dụng được với những project nhỏ khi mà mỗi đối tượng chỉ có một bean duy nhất trong khung chứa của Spring. Khi đó bằng cách thay đổi thuộc tính autowire=”byType” khi khai báo một bean, Spring sẽ tự động đưa đối tượng phụ thuộc vào đối tượng bị phụ thuộc cũng qua phương thức setter của đối tượng bị phụ thuộc.

Kết quả:

Bean autowiring trong Spring là gì?

Nếu các bạn cố tình khai báo thêm một bean khác của đối tượng phụ thuộc như sau:

Thì khi chạy sẽ gặp lỗi:

Bean autowiring trong Spring là gì?



constructor

Giống như thuộc tính autowire=”byType”, cách này chúng ta cũng chỉ áp dụng khi đối tượng của chúng ta chỉ có một bean duy nhất trong khung chứa của Spring. Khi đó, Spring sẽ tự động đưa đối tượng phụ thuộc vào đối tượng bị phụ thuộc qua constructor của đối tượng bị phụ thuộc.

Ví dụ, chúng ta thay đổi cấu hình của bean room như sau:

Kết quả:

Bean autowiring trong Spring là gì?

4.8/5 - (12 bình chọn)

14 thoughts on “Bean autowiring trong Spring là gì?

  1. Hi anh, sau khi test thì em thấy by contructor giống với by Name hơn, bởi Khi em khai báo các bean cùng type trong spring.xml thì khi chạy không có bất kì một exception nào được ném ra, ngược lại thì chương trình vẫn chạy bình thường và chỉ bean có id trùng với tên của tham số trong contructor thì mới được inject. A thử check lại trường hợp này xem nhé. Thanks anh nhiều. 🙂

  2. A cho e hỏi : trong vd autowire byName e thử sửa tên bên table trong class Rôm thành private Table tbl; trong spring.xml làm y hệt vd trên. V tại sao e vẫn lấy được giá trị 123456 ghi id Table trong spring là table, còn tên biến trong Room là tbl ?

  3. em cảm ơn anh nhiều! Cho em hỏi là có đối tượng nào không autowire không? Và nếu có thì là những đối tượng nào?

    1. Cảm ơn em đã phát hiện ra chỗ đó.

      Do lúc nói đến cái autowire bằng constructor anh có thêm constructor để giải thích chỗ đó mà không để ý nó sẽ bị lỗi hai cái đã nói vì ko có default constructor.

      Thanks em một lần nữa.

      Đã sửa lại.

  4. good, em đợi bài viết của anh mấy ngày rồi. hy vọng anh làm seri từ đầu đến cuối luôn, có nhiều chỗ hướng dẫn nhưng nửa vời quá, học ko hiệu quả.

    1. Chỗ nào anh hướng dẫn chưa kỹ, em cứ nói để anh sửa lại nhé! Anh mong nhận được đóng góp ý kiến từ tất cả mọi người.

Add Comment