क्या स्प्रिंग एनोटेशन @ कॉंट्रोलर @ सर्विस के समान है?


80

क्या स्प्रिंग एनोटेशन @Controllerसमान है @Service?

मेरे पास इसके बारे में विचार है @Controllerजिसका उपयोग URLव्यावसायिक तर्क के मानचित्रण और आह्वान के लिए किया जा सकता है।

जबकि @Serviceव्याख्या सेवा वर्ग जो व्यापार तर्क शामिल करते थे।

क्या मैं सेवा वर्ग को एनोटेट करने के @Controllerबजाय उपयोग कर सकता हूं @Service?

जवाबों:


124

नहीं, वे एक दूसरे से बहुत अलग हैं।

दोनों @ अनाउंसमेंट एनोटेशन के अलग-अलग विशेषज्ञ हैं (व्यवहार में, वे एक ही इंटरफ़ेस के दो अलग-अलग कार्यान्वयन हैं) इसलिए दोनों को क्लासपैथ स्कैनिंग द्वारा खोजा जा सकता है (यदि आप इसे अपने XML कॉन्फ़िगरेशन में घोषित करते हैं)

@सर्विस एनोटेशन का उपयोग आपकी सेवा परत में किया जाता है और सेवा कार्यों को करने वाली कक्षाओं को एनोटेट करता है, अक्सर आप इसका उपयोग नहीं करते हैं लेकिन कई मामलों में आप इस एनोटेशन का उपयोग एक सर्वोत्तम अभ्यास का प्रतिनिधित्व करने के लिए करते हैं। उदाहरण के लिए, आप सीधे अपने डेटाबेस में किसी वस्तु को बनाए रखने के लिए एक डीएओ वर्ग को बुला सकते हैं लेकिन यह भयानक है। एक सेवा वर्ग को कॉल करना बहुत अच्छा है जो एक डीएओ को बुलाता है। चिंताओं के पैटर्न को अलग करने के लिए यह एक अच्छी बात है।

@ कॉन्ट्रोलर एनोटेशन स्प्रिंग एमवीसी फ्रेमवर्क (वेब ​​एप्लीकेशन को लागू करने के लिए उपयोग किया जाने वाला स्प्रिंग फ्रेमवर्क का घटक) में उपयोग किया जाने वाला एक एनोटेशन है। @Controller एनोटेशन इंगित करता है कि एक विशेष वर्ग एक नियंत्रक की भूमिका निभाता है। @Controller एनोटेशन एनोटेट वर्ग के लिए एक स्टीरियोटाइप के रूप में कार्य करता है, जो इसकी भूमिका को दर्शाता है। प्रेषणकर्ता मैप किए गए तरीकों के लिए ऐसे एनोटेट वर्गों को स्कैन करता है और @RequestMapping एनोटेशन का पता लगाता है।

इसलिए स्प्रिंग एमवीसी आर्किटेक्चर को देखते हुए आपके पास डिस्पैचर सेर्वलेट क्लास है (जिसे आप अपने एक्सएमएल कॉन्फ़िगरेशन में घोषित करते हैं) जो एक फ्रंट कंट्रोलर का प्रतिनिधित्व करता है जो सभी HTTP रिक्वेस्ट को उचित कंट्रोलर क्लासेस (@Controller द्वारा एनोटेट) के लिए डिस्पैच करता है। यह वर्ग अपनी पद्धति से व्यावसायिक तर्क (और सेवाओं को कॉल कर सकता है) करता है। इन वर्गों (या इसके तरीकों) को आमतौर पर @RequestMapping एनोटेशन के साथ भी एनोटेट किया जाता है जो निर्दिष्ट करते हैं कि HTTP अनुरोध नियंत्रक द्वारा और इसके विधि द्वारा नियंत्रित किया जाता है।

उदाहरण के लिए:

@Controller
@RequestMapping("/appointments")
public class AppointmentsController {

    private final AppointmentBook appointmentBook;

    @Autowired
    public AppointmentsController(AppointmentBook appointmentBook) {
        this.appointmentBook = appointmentBook;
    }

    @RequestMapping(method = RequestMethod.GET)
    public Map<String, Appointment> get() {
        return appointmentBook.getAppointmentsForToday();
    }

यह वर्ग एक नियंत्रक है।

यह क्लास सभी HTTP रिक्वेस्ट को "/ अपॉइंटमेंट्स" "फ़ोल्डर" के लिए हैंडल करती है और विशेष रूप से प्राप्त विधि वह तरीका है जिसे सभी GET HTTP रिक्वेस्ट को फोल्डर की ओर हैंडल करने के लिए "/ अपॉइंटमेंट्स" कहा जाता है।

मुझे उम्मीद है कि अब यह आपके लिए अधिक स्पष्ट है।


3
बहुत अच्छी व्याख्या। एक बिंदु का उल्लेख करने के लिए, (पर) नियंत्रक कक्षाओं की जरूरत नहीं है (पर) RequestMapping, (पर) RequestMapping विधि स्तर भी हो सकता है।
टाइमकीपर

1
क्या मैं उन्हें एकल श्रेणी की परिभाषा में मिला सकता हूं? या उन्हें अलग वर्गों के रूप में लागू करना बेहतर है?
केंसई

37

आप की परिभाषा को देखें, तो @Controller, @Serviceएनोटेशन, तो आप उस इनमें से विशेष प्रकार मिल जाएगा @Componentएनोटेशन।

@Component
public @interface Service {
    ….
}

 

@Component
public @interface Controller {
    …
}

तो क्या अंतर है?

@ नियंत्रक

@Controllerएनोटेशन इंगित करता है कि एक विशेष वर्ग एक नियंत्रक की भूमिका में कार्य करता है। @Controllerएनोटेशन, उसकी व्याख्या वर्ग के लिए एक स्टीरियोटाइप के रूप में कार्य में अपनी भूमिका का संकेत है।

@Controller के बारे में क्या खास है?

आप की तरह किसी अन्य के साथ इस एनोटेशन परिवर्तन नहीं कर सकते @Serviceया @Repository, भले ही वे एक ही लग रही है। प्रेषणकर्ता ने एनोटेट वर्गों को स्कैन किया @Controllerऔर @RequestMappingउनके भीतर एनोटेशन का पता लगाया । आप केवल एनोटेट कक्षाओं @RequestMappingपर उपयोग कर सकते @Controllerहैं।


@सर्विस

@Services रिपोजिटरी लेयर में बिजनेस लॉजिक और कॉल मेथड रखें।

@ सेवा के बारे में क्या खास है?

इस तथ्य के अलावा कि यह इंगित करने के लिए उपयोग किया जाता है कि यह व्यावसायिक तर्क धारण कर रहा है, कोई ध्यान देने योग्य विशेषता नहीं है जो यह एनोटेशन प्रदान करता है, लेकिन कौन जानता है, वसंत भविष्य में कुछ अतिरिक्त असाधारण जोड़ सकता है।

लिंक किया गया उत्तर: स्प्रिंग में @Component, @Repository & @Service एनोटेशन के बीच अंतर क्या है?


7

नहीं, @Controllerयह समान नहीं है @Service, हालांकि वे दोनों के विशेषज्ञ हैं @Component, उन्हें कक्षापथ स्कैनिंग द्वारा खोज के लिए दोनों उम्मीदवार बनाते हैं। @Serviceएनोटेशन आपकी सेवा परत में प्रयोग किया जाता है, और @Controllerअपनी प्रस्तुति परत में वसंत MVC नियंत्रकों के लिए है। एक @Controllerआम तौर पर एक यूआरएल मानचित्रण के लिए होता है और एक वेब अनुरोध के द्वारा शुरू किया जा।


5

@ सेवा बनाम @ नियंत्रक

@ सेवा: वर्ग एक "बिजनेस सर्विस फेस" (कोर जे 2 ईई पैटर्न अर्थ में), या ऐसा ही कुछ है।

@ नियंत्रक: इंगित करता है कि एक एनोटेट वर्ग एक "नियंत्रक" (जैसे एक वेब नियंत्रक) है।

---------- प्रमुख स्टीरियोटाइप्स http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotyp/Component.html पर उपयोगी नोट खोजें

@ प्रस्तुतकर्ता घटक

  @Target(value=TYPE)
     @Retention(value=RUNTIME)
     @Documented
    public @interface Component

इंगित करता है कि एक एनोटेट वर्ग एक घटक है। एनोटेशन-आधारित कॉन्फ़िगरेशन और क्लासपैथ स्कैनिंग का उपयोग करते समय ऐसी कक्षाओं को ऑटो-डिटेक्शन के लिए उम्मीदवार माना जाता है।

अन्य श्रेणी-स्तरीय एनोटेशन को एक घटक की पहचान करने के रूप में माना जा सकता है, आमतौर पर एक विशेष प्रकार का घटक: जैसे @Repository एनोटेशन या AspectJ के @Aspect एनोटेशन।

@ सर्फेस कंट्रोलर

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Controller

इंगित करता है कि एक एनोटेट वर्ग एक "नियंत्रक" (जैसे एक वेब नियंत्रक) है।

यह एनोटेशन @Component की विशेषज्ञता के रूप में कार्य करता है, कार्यान्वयन कक्षाओं के लिए क्लासपैथ स्कैनिंग के माध्यम से ऑटोडेट की अनुमति देता है। यह आमतौर पर RequestMapping एनोटेशन के आधार पर एनोटेट हैंडलर विधियों के संयोजन में उपयोग किया जाता है।

@ इंटरफ़ेस सेवा

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Service

इंगित करता है कि एक एनोटेट वर्ग एक "सेवा" है, जिसे मूल रूप से डोमेन-ड्रिवेन डिज़ाइन (इवांस, 2003) द्वारा परिभाषित किया गया है, "एक इंटरफ़ेस के रूप में पेश किया जाने वाला एक ऑपरेशन जो कि बिना किसी अतिक्रमित अवस्था के साथ मॉडल में अकेला खड़ा है।" मई यह भी इंगित करता है कि एक वर्ग "बिजनेस सर्विस फेस" (कोर जे 2 ईई पैटर्न अर्थ में) या कुछ इसी तरह का है। यह एनोटेशन एक सामान्य उद्देश्य वाला स्टीरियोटाइप है और अलग-अलग टीमें अपने शब्दार्थ को संकीर्ण कर सकती हैं और उचित रूप में उपयोग कर सकती हैं।

यह एनोटेशन @Component के स्पेशलाइजेशन के रूप में कार्य करता है, कार्यान्वयन कक्षाओं के लिए क्लासपैथ स्कैनिंग के माध्यम से ऑटोडेट की अनुमति देता है।

@interface रिपोजिटरी

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Repository

इंगित करता है कि एक एनोटेट वर्ग एक "रिपॉजिटरी" है, जिसे मूल रूप से डोमेन-ड्रिवेन डिज़ाइन (इवांस, 2003) द्वारा परिभाषित किया गया है, "वस्तुओं के संग्रह का अनुकरण करने वाले भंडारण, पुनर्प्राप्ति और खोज व्यवहार के लिए एक तंत्र"। पारंपरिक J2EE पैटर्न जैसे "डेटा एक्सेस ऑब्जेक्ट" को लागू करने वाली टीमें भी इस स्टीरियोटाइप को DAO वर्गों पर लागू कर सकती हैं, हालांकि ऐसा करने से पहले डेटा एक्सेस ऑब्जेक्ट और DDD- शैली रिपॉजिटरी के बीच अंतर को समझने के लिए ध्यान रखा जाना चाहिए। यह एनोटेशन एक सामान्य उद्देश्य वाला स्टीरियोटाइप है और अलग-अलग टीमें अपने शब्दार्थ को संकीर्ण कर सकती हैं और उचित रूप में उपयोग कर सकती हैं।

एक वर्ग इस प्रकार एनोटेट किया जाता है जब स्प्रिंग डेटाएस्टेसेप्शन अनुवाद के लिए योग्य होता है जब एक PersistenceExceptionTranslationPostProcessor के साथ संयोजन में उपयोग किया जाता है। टंकण, पहलुओं आदि के प्रयोजन के लिए समग्र अनुप्रयोग वास्तुकला में इसकी भूमिका के रूप में एनोटेट वर्ग को भी स्पष्ट किया जाता है।

स्प्रिंग 2.5 के रूप में, यह एनोटेशन @Component के विशेषज्ञता के रूप में भी कार्य करता है, जिससे कार्यान्वयन कक्षाओं के लिए क्लासपैथ स्कैनिंग के माध्यम से ऑटोडेट किया जा सकता है।


1

मैं पहले से ही यहाँ पर इसी तरह के सवाल का जवाब दिया है यहाँ लिंक है

नहीं दोनों अलग हैं।

@ सेवा एनोटेशन का अन्य उद्देश्य के लिए उपयोग होता है और अन्य के लिए @ नियंत्रक उपयोग। दरअसल स्प्रिंग @Component, @Service, @Repository और @Controller एनोटेशन का उपयोग स्प्रिंग फ्रेमवर्क में classpath स्कैन का उपयोग करके स्वचालित बीन डिटेक्शन के लिए किया जाता है, लेकिन इसका मतलब यह नहीं है कि सभी फ़ंक्शंस समान हैं। @ सेवा: यह इंगित करता है कि एनोटेट वर्ग व्यावसायिक परत में एक सेवा घटक है।

@ नियंत्रक: एनोटेट वर्ग इंगित करता है कि यह एक नियंत्रक घटक है, और मुख्य रूप से प्रस्तुति परत पर उपयोग किया जाता है।


0

नहीं, तुम नहीं कर सकते वे अलग हैं। जब एप्लिकेशन को तैनात किया गया था तो आपके नियंत्रक मैपिंग को उदाहरण के लिए बोर्क किया जाएगा।

आप किसी भी तरह क्यों करना चाहते हैं, एक नियंत्रक एक सेवा नहीं है, और इसके विपरीत।


0

एक्शन में स्प्रिंग से

जैसा कि आप देख सकते हैं, यह वर्ग @Controller के साथ एनोटेट है। अपने दम पर, @ कंट्रोलर ज्यादा कुछ नहीं करता है। इसका प्राथमिक उद्देश्य घटक स्कैनिंग के लिए एक घटक के रूप में इस वर्ग की पहचान करना है। क्योंकि HomeController @Controller के साथ एनोटेट किया गया है, स्प्रिंग का घटक स्कैनिंग स्वचालित रूप से इसे पता चलता है और स्प्रिंग एप्लीकेशन संदर्भ में सेम के रूप में HomeController का एक उदाहरण बनाता है।

वास्तव में, मुट्ठी भर अन्य एनोटेशन (@Component, @Service और @Repository सहित) @Controller के समान एक उद्देश्य पूरा करते हैं। आप उन अन्य किसी भी एनोटेशन के साथ होमकंट्रोलर को प्रभावी रूप से एनोटेट कर सकते हैं, और यह अभी भी उसी तरह काम करेगा। @Controller का विकल्प, हालांकि, अनुप्रयोग में इस घटक की भूमिका के बारे में अधिक विवरणात्मक है।


0

तुम एक घोषणा कर सकते हैं @service रूप @Controller

आप कर सकते हैं नहीं एक घोषित @Controller रूप @Service

@सर्विस

यह नियमित है। आप सिर्फ क्लास को कंपोनेंट घोषित कर रहे हैं।

@ नियंत्रक

यह Component की तुलना में थोड़ा अधिक विशेष है। डिस्पैचर के लिए खोज करेंगे @RequestMapping यहाँ। तो @Controller के साथ एनोटेट किया गया एक वर्ग, अतिरिक्त रूप से URL घोषित करने के साथ सशक्त होगा, जिसके माध्यम से API को बुलाया जाता है


0
  • नियंत्रक विभिन्न विचारों के बीच नेविगेशन को संभालेगा। आपके मैपिंग अनुरोध मैपिंग को कंट्रोलर की मदद से हैंडल किया जाता है।
  • सेवा सीधे रिपॉजिटरी के साथ बातचीत करती है जहां आमतौर पर व्यापारिक तर्क किया जाता है। आप सेवा स्तर पर जोड़ सकते हैं, हटा सकते हैं, हटा सकते हैं आदि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.