01/10/2018, 17:26

Autowired trong spring java?

em có 1 số câu hỏi về spring mvc trong java

  1. khi em tạo spring repository , em làm theo hướng dẫn trên mạng thì sẽ viết thế này
@Repository
public interface BookRepository extends CrudRepository<Bookmaster, Integer> {
   // code crud
}

use : 
@autowired
BookRepository bookRepository ;

vậy cho em hỏi cái đối tượng bookRepository nó sẽ được khởi tạo từ lớp nào , vì em thấy bản thân nó là interface thì chắc chắn sẽ phải có 1 class implement nó thì mới tạo đối tượng được nhưng trong spring chỉ cần dùng autowired là nó tự động tạo đối tượng cho mình?

  1. theo em được biết các bean mà ta khai báo để container thực hiện việc inject vào các class sẽ được xậy dựng theo singleton >>> tức là mỗi bean sẽ là duy nhất trong toàn bộ ứng dụng
    nhưng đối với 1 webapp bằng java thì sẽ có nhiều request gởi đến cùng lúc và muốn sử dụng các bean này >>> vậy ở đây xảy ra điều gì ? 1. cùng 1 bean phục vụ cho nhiều thread và container sẽ đồng bộ hóa dữ liệu giữ các thread >>> nhưng thế này em thấy không hợp lý vì lỡ như có cả triệu request mà dùng chung 1 bean thì sẽ dễ bị nút cổ chai , 2. nó tạo ra nhiều bean mỗi lần có request gửi tới nó sẽ inject bean đó vào thread
KieuThinh viết 19:30 ngày 01/10/2018
  1. Không phải các bean được xây dựng theo singleton đâu bạn, xây dựng theo singleton hay Factory là phụ thuộc vào cách ta viết thôi.
June 14th viết 19:31 ngày 01/10/2018

@autowired BookRepository bookRepository ;

  1. bookRepository sẽ chỉ đc khởi tạo nếu class reference tới nó là 1 bean. Còn thằng chịu trách nhiệm khởi tạo bookRepository là Spring IoC container. Lúc app của bạn boot lên, thằng container này sẽ đi quét toàn bộ các beans hiện có trong cây thư mục, sau đó nó sẽ thấy 1 bean đang cần sử dụng instance của BookRepository, nó sẽ tiến hành inject vào biến bookRepository của bean đó để bạn có thể sử dụng.
  1. cùng 1 bean phục vụ cho nhiều thread và container sẽ đồng bộ hóa dữ liệu giữ các thread >>> nhưng thế này em thấy không hợp lý vì lỡ như có cả triệu request mà dùng chung 1 bean thì sẽ dễ bị nút cổ chai
  1. Không phải lúc nào bean được tao ra cũng theo dạng singleton. Mặc định khi tạo bean nếu bạn ko chỉ định gì thêm thì nó mới tạo bean dưới dạng singleton. Khi 1 bean được tạo ra dưới dạng singleton, Spring IoC container sẽ tạo 1 và chỉ 1 instance của bean đó và lưu nó dưới cache. Với singleton, người ta không sửa đổi dữ liệu của bean vì nó là shared instance và dữ liệu có thể bị sai lệch giữa các thread đang dùng bean đó. Cuối cùng, một bean hoàn toàn có thể được access bởi hàng triệu request, ko vấn đề gì nếu dữ liệu của nó nhất quán giữa các thread và không có sự can thiệp chỉnh sửa dữ liệu của bean.

Tại sao nó làm được vậy? Ví dụ như bean bookRepository ở trên, vùng nhớ của bean này nằm ở heap của JVM. Giả sử có nhiều request xảy ra cùng 1 lúc (concurrent requests) và đều gọi tới cùng 1 bean này, chương trình sẽ trỏ tới vùng nhớ đó và gọi ra đoạn code bên trong bean mà mỗi request yêu cầu. Mỗi request chạy trong một thread riêng, đoạn code cũng được thực thi trong mỗi thread riêng ko ảnh hưởng gì nhau => không bao giờ có chuyện chờ nhau mà xảy ra nút cổ chai được.

Bài liên quan
0