2015-01-19 2 views
5

В нашем весеннем приложении мы используем HttpServletRequest двумя способами:не могу понять `@Autowired HttpServletRequest` весна-MVC хорошо

(код здесь Simplied, и кажется бессмысленным)

  1. В контроллере:

    @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. В нормальной компоненты:

    @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"); 
        } 
    } 
    

Во-первых, я думал, что второй способ совершенно неправ, потому что он должен только вводить экземпляр request один раз. Поэтому независимо от того, когда я вызываю метод getHeaderAbc(), он должен возвращать то же значение (первого запроса).

Но когда я пытаюсь это, я нашел несколько интересных вещей:

  1. request.hashCode() в контроллере всегда отличается (как я ожидал)
  2. request.hashCode() в RequestService всегда то же самое (как я думал)
  3. Но значение заголовка отличается, если я выдаю запрос с другим заголовком abc !!!

Кажется, для одноточечного RequestService, пружина удерживает экземпляр request, но изменил заголовки, которые он содержит!

Как это понять?

ответ

7

Посмотрите на прокси-сервер. http://www.java-allandsundry.com/2012/08/spring-scoped-proxy.html В основном вы вводите прокси-сервер, который хранит ссылки на текущие бобы HttpRequest и дает вам правильный выбор, выбирая его идентификатором запроса.

IMHO Использование HttpRequest за пределами веб-уровня не является хорошей практикой. Я бы использовал его только в controlellrs.

Смежные вопросы