2015-01-19 20 views
5

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)

  1. 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); 
    } 
    
  2. 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ị:

  1. 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)
  2. Các request.hashCode() trong RequestService luôn là như nhau (như tôi nghĩ)
  3. 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ó?

Trả lời

7

Hãy xem proxy có phạm vi. http://www.java-allandsundry.com/2012/08/spring-scoped-proxy.html Về cơ bản, bạn tiêm một proxy giữ một tham chiếu đến các bean HttpRequest hiện tại và cung cấp cho bạn quyền phù hợp, chọn nó theo id yêu cầu.

IMHO sử dụng HttpRequest bên ngoài lớp web không phải là phương pháp hay. Tôi sẽ sử dụng nó chỉ trong các controlellrs.

Các vấn đề liên quan