Sử dụng Jersey với Spring Boot

Sep 15 2020

Tài liệu Tham khảo Khởi động Mùa xuân trong phần có tiêu đề 7.3 JAX-RS và Jersey đề cập " Tất cả các điểm cuối đã đăng ký phải là @Components với chú thích tài nguyên HTTP (@GET và các loại khác). Vì Điểm cuối là một Spring @Component, vòng đời của nó được quản lý bởi Spring và bạn có thể sử dụng chú thích @Autow mong muốn để đưa vào các phụ thuộc và sử dụng chú thích @Value để chèn cấu hình bên ngoài ".

Nhưng tôi không quan tâm đến việc tiêm các thành phần phụ thuộc hoặc cấu hình bên ngoài vào tài nguyên Jersey của mình và do đó tôi không chú thích tài nguyên Jersey của mình là @Components. Ứng dụng của tôi hoạt động tốt.

Từ việc đọc Tài liệu Tham khảo Khởi động Mùa xuân, có vẻ như việc đăng ký tài nguyên Jersey dưới dạng @Components là một yêu cầu. Nhưng điều đó dường như không phải là trường hợp. Đối với tôi, đây có vẻ như là một lỗi nhỏ trong Tài liệu Tham khảo Khởi động Mùa xuân. Có thể tài liệu có thể được cập nhật từ " điểm cuối đã đăng ký nên là @Components " thành " điểm cuối đã đăng ký có thể là @Components ". Điều này có nghĩa không?

Trả lời

RahulKhimasia Sep 17 2020 at 04:29

Tôi đã thử điều này và nhận thấy rằng việc chú thích một tài nguyên Jersey bằng chú thích Spring @Component là tùy chọn. Nếu bạn sử dụng chú thích đó thì vòng đời của tài nguyên sẽ do Spring quản lý và nếu bạn KHÔNG sử dụng chú thích đó thì vòng đời sẽ do Jersey quản lý.

Một điều quan trọng cần lưu ý là có sự khác biệt lớn về cách mà vòng đời được lập trình theo mặc định giữa cả hai.

Như đã nêu trong phần 3.4 của Hướng dẫn sử dụng Jersey " Theo mặc định, vòng đời của các lớp tài nguyên gốc là theo yêu cầu, cụ thể là một phiên bản mới của lớp tài nguyên gốc được tạo mỗi khi đường dẫn URI yêu cầu khớp với tài nguyên gốc. Điều này tạo ra một mô hình lập trình rất tự nhiên trong đó các hàm tạo và trường có thể được sử dụng mà không cần quan tâm đến nhiều yêu cầu đồng thời đến cùng một tài nguyên. Nói chung, đây không phải là nguyên nhân gây ra các vấn đề về hiệu suất. Việc xây dựng lớp và thu gom rác của JVM đã được cải thiện đáng kể so với năm và nhiều đối tượng sẽ được tạo và loại bỏ để phân phát và xử lý yêu cầu HTTP và trả lại phản hồi HTTP. "

Nhưng như đã nêu trong Spring Framework Documentation phần 1.5 ; bean theo mặc định là singleton. " Spring IoC container tạo chính xác một thể hiện của đối tượng được xác định bởi định nghĩa bean đó. Đối tượng đơn lẻ này được lưu trữ trong bộ nhớ cache của các hạt singleton đó và tất cả các yêu cầu và tham chiếu tiếp theo cho bean có tên đó sẽ trả về đối tượng được lưu trong bộ nhớ cache. "

Do đó có sự khác biệt. Các lớp tài nguyên gốc Jersey bình thường theo mặc định được khởi tạo theo yêu cầu, trong khi với Spring khi một tài nguyên được chú thích bằng @Component thì nó sẽ là singleton. tức là chỉ có một phiên bản cho thời gian tồn tại của JVM. Nếu bạn muốn tài nguyên do Spring quản lý có cùng vòng đời theo yêu cầu đi kèm với tài nguyên Jersey thông thường thì bạn nên thêm @Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)chú thích Spring ngoài chú thích @Component. Bằng cách thêm nó, vòng đời tài nguyên của bạn bây giờ sẽ là theo yêu cầu.