2015-10-15 7 views
8

मैं निम्नलिखित 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 का उपयोग हर बार, यह एक ऐसी बढ़ती मान देता है। मैं सिर्फ जावा सीख रहा हूँ और मैं सोच रहा हूँ कारण है कि यह हमेशा AtomicLong का एक नया उदाहरण के रूप में 1 वापस नहीं करता है चाहिए हर बार अनुरोध आता नहीं बनाई गई है।

+2

तुम्हें क्या लगता है कि यह एक नया उदाहरण बनाने है करते हैं? – chrylis

+0

@chrylis: मैं मूल रूप से .NET पृष्ठभूमि से हूं और इसकी तुलना इसके साथ तुलना की गई थी। –

उत्तर

9

नहीं है, TestController सेम वास्तव में एक सिंगलटन है। @RestController एनोटेशन एक स्प्रिंग @Component जिसका गुंजाइश डिफ़ॉल्ट SINGLETON कर रहा है की घोषणा की। कोई रिक्त स्ट्रिंग ("") जो SCOPE_SINGLETON तात्पर्य को

चूक: यह @Scope एनोटेशन में प्रलेखित है।

इसका मतलब है कि यह TestController का एक ही उदाहरण होगा जो प्रत्येक अनुरोध को संभालेगा। चूंकि counter एक आवृत्ति चर है, यह प्रत्येक अनुरोध के लिए समान होगा।

+0

क्या यह सिंगलटन रखने या तथाकथित 'प्रोटोटाइप' के दायरे को सेट करने का अच्छा अभ्यास है? –

+0

@BabuJames एक 'नियंत्रक' के लिए, मैं कहूंगा कि इसे एक सिंगलटन रखना बेहतर है। 'नियंत्रक आमतौर पर राज्यिक नहीं होते हैं इसलिए उन्हें सिंगलटन बनाने में समझदारी होती है। – Tunaki

2

एक @RestController प्रत्येक अनुरोध के लिए नहीं बनाया गया है, यह हर अनुरोध के लिए ही रहता है। तो आपका counter अपना मान रखता है और हर बार बढ़ता जाता है।

संबंधित मुद्दे