2015-10-15 19 views
8

Tôi có Spring điều khiển sau:Spring MVC RestController phạm vi

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

Mỗi lần tôi truy cập REST API, nó sẽ trả về một giá trị tăng lên. Tôi chỉ học Java và tôi tự hỏi tại sao nó không phải luôn luôn trở lại 1 như là một trường hợp mới của AtomicLong phải được tạo ra mỗi khi yêu cầu đến.

+2

Tại sao bạn nghĩ rằng nó tạo ra một cá thể mới? – chrylis

+0

@chrylis: Tôi bắt nguồn từ nền .net và chỉ có so sánh với nó. –

Trả lời

9

Không, hạt TestController thực sự là một singleton. @RestController chú thích tuyên bố một Spring @Component có phạm vi là theo mặc định SINGLETON. Tài liệu này được ghi chú trong chú thích @Scope:

Mặc định là một chuỗi rỗng ("") ngụ ý SCOPE_SINGLETON.

Điều này có nghĩa là nó sẽ là cùng một phiên bản TestController sẽ xử lý mọi yêu cầu. Vì counter là một biến mẫu, nó sẽ giống nhau cho mọi yêu cầu.

+0

Thực hành tốt để giữ cho nó đơn điệu hay đặt phạm vi thành cái gọi là 'nguyên mẫu'? –

+0

@BabuJames Đối với một 'Bộ điều khiển', tôi sẽ nói tốt hơn là giữ cho nó là một singleton. 'Controller' thường không có trạng thái bình thường nên nó có ý nghĩa để làm cho chúng đơn điệu. – Tunaki

2

A @RestController không được tạo cho mỗi yêu cầu, nó vẫn giữ nguyên cho mọi yêu cầu. Vì vậy, counter giữ giá trị của nó và được tăng lên mỗi lần.

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