Trong ứng dụng mùa xuân của chúng tôi, chúng tôi sử dụng HttpServletRequest
theo hai cách:Không thể hiểu '@Autowired HttpServletRequest` của mùa xuân-MVC cũng
(mã ở đây được Giản thể, và dường như vô nghĩa)
Trong bộ điều khiển:
@RequestMapping(value = "/hello", method = RequestMethod.GET) @ResponseBody public ResponseEntity<String> hello(HttpServletRequest request) { System.out.println("## controller req.hashcode: " + request.hashCode()); System.out.println("## header 'abc': " + request.getHeader("abc")); return new ResponseEntity<String>("OK", HttpStatus.OK); }
Trong một thành phần bình thường:
@Component class RequestService { private final HttpServletRequest request; @Autowired public RequestService(HttpServletRequest request) { this.request = request; } public String getHeaderAbc() { System.out.println("## service req.hashcode: " + request.hashCode()); return this.request.getHeader("abc"); } }
Lúc đầu, tôi đã nghĩ cách thứ 2 hoàn toàn sai, vì nó chỉ nên tiêm ví dụ request
một lần. Vì vậy, không có vấn đề khi tôi gọi phương thức getHeaderAbc()
, nó sẽ trả về cùng một giá trị (của yêu cầu đầu tiên).
Nhưng khi tôi thử nó, tôi thấy một vài điều thú vị:
- Các
request.hashCode()
trong điều khiển phải lúc nào cũng khác nhau (như tôi mong đợi) - Các
request.hashCode()
trongRequestService
luôn là như nhau (như tôi nghĩ) - Nhưng giá trị tiêu đề khác nếu tôi đưa ra yêu cầu với tiêu đề khác
abc
!!!
Có vẻ như cho singleton RequestService
, mùa xuân giữ bản sao request
, nhưng đã thay đổi tiêu đề chứa!
Làm thế nào để hiểu nó?