2015-10-15 9 views
8

У меня есть следующий Spring контроллер:Spring MVC RestController сфера

package hello; 

import java.util.concurrent.atomic.AtomicLong; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class TestController { 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/test") 
    public String test() { 
     long val = counter.incrementAndGet(); 
     return String.valueOf(val); 
    } 
} 

Каждый раз, когда я получить доступ к REST API, он возвращает измененное значение. Я просто изучаю Java, и мне интересно, почему он не всегда возвращает 1, поскольку новый экземпляр AtomicLong должен быть создан каждый раз, когда приходит запрос.

+2

Почему вы думаете, что он создает новый экземпляр? – chrylis

+0

@chrylis: Я родом из фона .net и просто сравнил с ним. –

ответ

9

Нет, TestController bean на самом деле одноэлементный. @RestController аннотация объявляет весну @Component, объем которой по умолчанию SINGLETON. Это отражено в @Scope аннотацию:

Defaults в пустую строку (""), которая предполагает SCOPE_SINGLETON.

Это означает, что это будет тот же экземпляр TestController, который будет обрабатывать все запросы. Поскольку counter является переменной экземпляра, он будет таким же для каждого запроса.

+0

Является ли хорошей практикой держать его в одиночном режиме или задавать область действия так называемого «прототипа»? –

+0

@BabuJames Для «Контролера» я бы сказал, что лучше держать его в одиночном режиме. 'Контроллеры' s обычно не имеют состояния, поэтому имеет смысл сделать их одноточечными. – Tunaki

2

A @RestController не создано для каждого запроса, оно остается таким же для каждого запроса. Таким образом, ваш counter сохраняет свое значение и увеличивается каждый раз.

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