इन उत्तरों में से कई उत्तर पहले से ही बताए गए हैं कि ये एनोटेशन किसके लिए उपयोग किए जाते हैं, हम यहां उनके बीच कुछ छोटे अंतरों पर ध्यान देंगे।
पहली समानता
पहले बिंदु को फिर से उजागर करने के लायक है कि बीनडिफाइनमेंट के लिए स्कैन-ऑटो-डिटेक्शन और निर्भरता इंजेक्शन के संबंध में ये सभी एनोटेशन (अर्थात, @Component, @Service, @Repository, @Controller) समान हैं। हम दूसरे के स्थान पर एक का उपयोग कर सकते हैं और अभी भी अपना रास्ता प्राप्त कर सकते हैं।
@Component, @Repository, @Controller और @Service के बीच अंतर
@Component
यह एक सामान्य-उद्देश्य वाला स्टीरियोटाइप एनोटेशन है जो दर्शाता है कि वर्ग एक वसंत घटक है।
विशेष क्या है @Component के बारे में
<context:component-scan> केवल स्कैन करता है@Componentऔर के लिए नहीं लग रही है@Controller,@Serviceऔर@Repositoryसामान्य रूप में। वे स्कैन किए जाते हैं क्योंकि वे स्वयं एनोटेट होते हैं@Component।
बस एक नज़र रखना @Controller, @Serviceऔर @Repositoryएनोटेशन परिभाषाएँ:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
इस प्रकार, यह कहना गलत नहीं है @Controller, @Serviceऔर @Repositoryविशेष प्रकार के @Componentएनोटेशन हैं। <context:component-scan>उन्हें उठाता है और अपने निम्न वर्गों को सेम के रूप में पंजीकृत करता है, जैसे कि उन्हें एनोटेट किया गया था @Component।
विशेष प्रकार के एनोटेशन भी स्कैन किए जाते हैं, क्योंकि वे खुद @Componentएनोटेशन के साथ एनोटेट होते हैं, जिसका अर्थ है कि वे भी @Componentएस हैं। यदि हम अपने स्वयं के कस्टम एनोटेशन को परिभाषित करते हैं और इसके साथ एनोटेट करते हैं @Component, तो इसके साथ स्कैन भी हो जाएगा<context:component-scan>
@Repository
यह इंगित करना है कि वर्ग डेटा रिपॉजिटरी को परिभाषित करता है।
@Repository के बारे में क्या खास है?
यह इंगित करने के अलावा, कि यह एनोटेशन आधारित कॉन्फ़िगरेशन है , @Repositoryकार्य प्लेटफ़ॉर्म विशिष्ट अपवादों को पकड़ना है और उन्हें स्प्रिंग के एकीकृत अनियोजित अपवाद के रूप में फिर से फेंकना है। इसके लिए, हमें यह प्रदान किया जाता है PersistenceExceptionTranslationPostProcessorकि हमें अपने स्प्रिंग के एप्लिकेशन संदर्भ में इस तरह जोड़ना होगा:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
यह बीन पोस्ट प्रोसेसर किसी भी बीन के लिए एक सलाहकार जोड़ता है जिसे इसके साथ एनोटेट किया जाता है @Repositoryताकि किसी भी प्लेटफ़ॉर्म-विशिष्ट अपवाद को पकड़ा जाए और फिर स्प्रिंग के अनियंत्रित डेटा एक्सेस अपवादों में से एक के रूप में फिर से फेंक दिया जाए।
@Controller
@Controllerएनोटेशन इंगित करता है कि एक विशेष वर्ग एक नियंत्रक की भूमिका में कार्य करता है। @Controllerएनोटेशन, उसकी व्याख्या वर्ग के लिए एक स्टीरियोटाइप के रूप में कार्य में अपनी भूमिका का संकेत है।
@Controller के बारे में क्या खास है?
हम किसी भी अन्य के साथ इस एनोटेशन परिवर्तन नहीं कर सकते @Serviceया @Repository, भले ही वे एक ही लग रही है। डिस्पैचर ने एनोटेट वर्गों को स्कैन किया @Controllerऔर @RequestMappingउनके भीतर एनोटेशन के साथ एनोटेट तरीकों का पता लगाता है। हम उपयोग कर सकते हैं @RequestMappingकेवल उन तरीकों जिसका वर्गों द्वारा एनोटेट में पर / @Controllerऔर यह होगा नहीं के साथ काम @Component, @Service, @Repositoryआदि ...
नोट: यदि किसी वर्ग को किसी वैकल्पिक विधि के माध्यम से पहले से ही पंजीकृत किया जाता है, जैसे कि के माध्यम से @Beanया के माध्यम से @Component, @Serviceआदि ... एनोटेशन, तो @RequestMappingक्लास को @RequestMappingएनोटेशन के साथ भी एनोटेट किया जा सकता है । लेकिन यह एक अलग परिदृश्य है।
@सर्विस
@Service बीन्स व्यापारिक तर्क रखते हैं और रिपॉजिटरी लेयर में कॉल के तरीके बताते हैं।
@ सेवा के बारे में क्या खास है?
इस तथ्य के अलावा कि यह इंगित करने के लिए उपयोग किया जाता है, कि यह व्यवसाय तर्क को पकड़ रहा है, इस एनोटेशन में ध्यान देने योग्य कुछ और नहीं है; लेकिन कौन जानता है, वसंत भविष्य में कुछ अतिरिक्त असाधारण जोड़ सकता है।
और क्या?
उपरोक्त के समान, भविष्य में वसंत के लिए विशेष कार्यशीलता जोड़ सकते हैं @Service, @Controllerऔर @Repositoryउनके स्तर पर सम्मेलनों के आधार पर। इसलिए, यह हमेशा एक अच्छा विचार है कि सम्मेलन का सम्मान करें और इसे परतों के अनुरूप उपयोग करें।