01/10/2018, 17:26
Autowired trong spring java?
em có 1 số câu hỏi về spring mvc trong java
- 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?
- 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
Bài liên quan
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.