परिचय: Spring में एक ही काम के लिए तीन एनोटेशन क्यों?
\n\nजो कोई भी Spring के साथ काम करना शुरू करता है, वह देर-सबेर यह सवाल पूछता है: "तीन अलग-अलग एनोटेशन — @Component, @Repository और @Service — की आवश्यकता क्यों है, जबकि ये सभी कंटेक्स्ट में बीन को रजिस्टर करते हैं?"
यह सवाल इतना लोकप्रिय है कि Stack Overflow पर इसके हज़ारों व्यू और दर्जनों जवाब हैं। और यह कोई संयोग नहीं है। पहली नज़र में, ये एनोटेशन वास्तव में एक ही काम करते हैं। लेकिन हमेशा की तरह, शैतान विवरण में छिपा है।
\n\nइस लेख में हम केवल अंतरों को सूचीबद्ध नहीं करेंगे। हम Spring के दर्शन को समझेंगे, कंटेनर के अंदर झाँकेंगे और दिखाएंगे कि एनोटेशन का सही उपयोग आपके प्रोजेक्ट को छिपी हुई बगों से कैसे बचा सकता है। चलिए शुरू करते हैं!
\n\nसंक्षिप्त जानकारी: स्टीरियोटाइप एनोटेशन क्या हैं?
\n\nये तीनों एनोटेशन तथाकथित स्टीरियोटाइप एनोटेशन (stereotype annotations) के अंतर्गत आते हैं। ये Spring को बताते हैं कि क्लास एक प्रबंधित घटक (बीन) है और इसे classpath स्कैनिंग के दौरान स्वचालित रूप से खोजा जाना चाहिए।
\n\nमूल एनोटेशन @Component है। यह आधार है। @Repository, @Service और @Controller, @Component के विशिष्ट रूप हैं, जो अतिरिक्त अर्थ और व्यवहार जोड़ते हैं।
@Target(ElementType.TYPE)\n@Retention(RetentionPolicy.RUNTIME)\n@Documented\n@Component // यह मुख्य बिंदु है!\npublic @interface Service {\n // ...\n}\n\nजैसा कि आप देख सकते हैं, @Service स्वयं @Component से एनोटेट है। इसका मतलब है कि Spring इसे बिल्कुल सामान्य @Component की तरह ही प्रोसेस करेगा। लेकिन फिर इसे जटिल क्यों बनाया गया?
@Component — सर्व-उपयोगी सैनिक
\n\n@Component सबसे सामान्य एनोटेशन है। इसका उपयोग तब करें जब आपकी क्लास अधिक विशिष्ट श्रेणियों में से किसी में भी फिट नहीं बैठती।
सामान्य उदाहरण:
\n- \n
- सहायक उपयोगिताएँ \n
- कॉन्फ़िगरेशन ऑब्जेक्ट (
@Configurationके साथ भ्रमित न करें) \n - कोई भी क्लास जो बीन होनी चाहिए, लेकिन सर्विस, रिपॉजिटरी या कंट्रोलर नहीं है \n
import org.springframework.stereotype.Component;\n\n@Component\npublic class EmailValidator {\n\n public boolean isValid(String email) {\n return email != null && email.contains("@");\n }\n}\n\nध्यान दें: EmailValidator बिज़नेस लॉजिक नहीं करता (यह @Service नहीं है) और डेटाबेस के साथ काम नहीं करता (यह @Repository नहीं है)। इसलिए @Component एक आदर्श विकल्प है।
@Repository — डेटा का रक्षक
\n\n@Repository पहला विशिष्ट एनोटेशन है जो वास्तविक कार्यक्षमता जोड़ता है। बीन को रजिस्टर करने के अलावा, यह दो महत्वपूर्ण कार्य करता है:
- \n
- डेटा एक्सेस अपवादों को इंटरसेप्ट करना। Spring स्वचालित रूप से DAO (Data Access Object) से अपवादों को
DataAccessException— Spring की अपवाद श्रेणी में लपेटता है। \n - कोड की पठनीयता में सुधार। कोई भी डेवलपर
@Repositoryदेखते ही समझ जाता है: "अच्छा, यहाँ डेटाबेस के साथ काम हो रहा है।" \n
import org.springframework.stereotype.Repository;\nimport org.springframework.data.jpa.repository.JpaRepository;\n\n@Repository\npublic interface UserRepository extends JpaRepository<User, Long> {\n\n User findByEmail(String email);\n}\n\nमहत्वपूर्ण: यदि आप Spring Data JPA का उपयोग करते हैं और JpaRepository से इनहेरिट करते हैं, तो Spring स्वयं प्रॉक्सी-बीन बनाएगा। स्पष्ट @Repository एनोटेशन अनिवार्य नहीं है, लेकिन उद्देश्य को स्पष्ट रूप से इंगित करने के लिए अनुशंसित है।
@Repository की मुख्य "विशेषता" AOP-इंटरसेप्टर (PersistenceExceptionTranslationPostProcessor)
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
Docker और TypeScript: शून्य से एप्लिकेशन का कंटेनरीकरण
Go में इंटरफ़ेस स्लाइस का टाइप कन्वर्ट करना: उदाहरणों के साथ पूरी गाइड
Rust अनुप्रयोगों के प्रदर्शन का अनुकूलन: शुरुआती लोगों के लिए
Rust में त्रुटि प्रबंधन: try/catch और उससे आगे — उन्नत स्तर
Rust में डिपेंडेंसी इंजेक्शन: कोड उदाहरणों के साथ गाइड