इन उत्तरों में से कई उत्तर पहले से ही बताए गए हैं कि ये एनोटेशन किसके लिए उपयोग किए जाते हैं, हम यहां उनके बीच कुछ छोटे अंतरों पर ध्यान देंगे।
पहली समानता
पहले बिंदु को फिर से उजागर करने के लायक है कि बीनडिफाइनमेंट के लिए स्कैन-ऑटो-डिटेक्शन और निर्भरता इंजेक्शन के संबंध में ये सभी एनोटेशन (अर्थात, @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
उनके स्तर पर सम्मेलनों के आधार पर। इसलिए, यह हमेशा एक अच्छा विचार है कि सम्मेलन का सम्मान करें और इसे परतों के अनुरूप उपयोग करें।