java - वसंत में @ कॉम्पोनेंट, @ रिपोजिटरी और @ सेवा एनोटेशन के बीच क्या अंतर है?
spring spring-mvc (17)
क्या @Component
, @Repository
और @Service
एनोटेशन का उपयोग स्प्रिंग में एक दूसरे के लिए किया जा सकता है या क्या वे नोटेशन डिवाइस के रूप में कार्य करने के अलावा कोई विशेष कार्यक्षमता प्रदान करते हैं?
दूसरे शब्दों में, अगर मेरे पास सर्विस क्लास है और मैं @Service
से @Service
तक एनोटेशन @Service
@Component
, तो क्या यह अभी भी वैसे ही व्यवहार करेगा?
या एनोटेशन कक्षा के व्यवहार और कार्यक्षमता को भी प्रभावित करता है?
स्प्रिंग 2.5 आगे स्टीरियोटाइप एनोटेशन प्रस्तुत करता है: @ कॉम्पोनेंट, @ सेवा और @ नियंत्रक। @ कॉम्पोनेंट किसी भी वसंत-प्रबंधित घटक के लिए एक सामान्य स्टीरियोटाइप के रूप में कार्य करता है; जबकि, @ रिपोजिटरी, @ सेवा, और @ नियंत्रक अधिक विशिष्ट उपयोग मामलों (उदाहरण के लिए, दृढ़ता, सेवा, और प्रेजेंटेशन परतों में क्रमशः) के लिए @ कॉम्पोनेंट की विशेषज्ञता के रूप में कार्य करते हैं। इसका अर्थ यह है कि आप अपने घटक वर्गों को @ कॉम्पोनेंट के साथ एनोटेट कर सकते हैं, लेकिन उन्हें @Repository, @Service, या @Controller के साथ टिप्पणी करके, आपकी कक्षाएं उपकरण द्वारा प्रसंस्करण या पहलुओं के साथ संबद्ध होने के लिए अधिक उपयुक्त हैं। उदाहरण के लिए, इन स्टीरियोटाइप एनोटेशन पॉइंटकूट के लिए आदर्श लक्ष्य बनाते हैं। बेशक, यह भी संभव है कि @ रिपोजिटरी, @ सेवा, और @ नियंत्रक स्प्रिंग फ्रेमवर्क के भावी रिलीज में अतिरिक्त अर्थशास्त्र ले सकते हैं। इस प्रकार, यदि आप अपनी सेवा परत के लिए @ कॉम्पोनेंट या @ सेवा का उपयोग करने के बीच निर्णय ले रहे हैं, तो @ सेवा स्पष्ट रूप से बेहतर विकल्प है। इसी तरह, जैसा ऊपर बताया गया है, @Repository पहले से ही आपकी दृढ़ता परत में स्वचालित अपवाद अनुवाद के लिए मार्कर के रूप में समर्थित है।
@Component – Indicates a auto scan component. @Repository – Indicates DAO component in the persistence layer. @Service – Indicates a Service component in the business layer. @Controller – Indicates a controller component in the presentation layer.
संदर्भ: - स्प्रिंग दस्तावेज़ीकरण - क्लासपाथ स्कैनिंग, प्रबंधित घटक और जावा का उपयोग कर कॉन्फ़िगरेशन लिखना
1. इन रूढ़िवादों के बीच बड़ा अंतर यह है कि वे विभिन्न वर्गीकरण के लिए उपयोग किए जाते हैं।
2. एक बहुआयामी आवेदन में, हमारे पास प्रेजेंटेशन, सेवा, व्यवसाय, डेटा एक्सेस इत्यादि जैसी अलग-अलग परतें होंगी। जब स्प्रिंग द्वारा ऑटो-डिटेक्शन के लिए कक्षा को एनोटेट किया जाना है, तो हमें नीचे के संबंधित स्टीरियोटाइप का उपयोग करना चाहिए।
-
@Component
- जेनेरिक और एप्लिकेशन में इस्तेमाल किया जा सकता है। - सेवा सेवा स्तर पर @ सेवा - एनोटेट कक्षाएं।
- @ नियंत्रक - प्रेजेंटेशन परत स्तर पर एनोटेट कक्षाएं, मुख्य रूप से स्प्रिंग एमवीसी में उपयोग की जाती हैं।
-
@Repository
- दृढ़ता परत पर एनोटेट कक्षाएं, जो डेटाबेस भंडार के रूप में कार्य करेगी। यदि तकनीकी रूप से वे समान होने जा रहे हैं तो हमें इन्हें अलग-अलग परतों के स्तर पर क्यों उपयोग करने की आवश्यकता है। सभी परतों पर इसका उपयोग क्यों न करें। उदाहरण के लिए, यदि हम सभी परतों में @ सेवा का उपयोग करते हैं, तो सभी सेम तत्काल हो जाएंगे और कोई समस्या नहीं होगी। मामूली अंतर है, उदाहरण के लिए @ रिपोजिटरी पर विचार करें।
पोस्टप्रोसेसर स्वचालित रूप से सभी अपवाद अनुवादकों (PersistenceExceptionTranslator इंटरफ़ेस के कार्यान्वयन) को देखता है और @Repository एनोटेशन के साथ चिह्नित सभी बीन्स को सलाह देता है ताकि खोजे गए अनुवादक फेंकने वाले अपवादों पर उचित अनुवाद को रोक और लागू कर सकें।
- उपर्युक्त के समान, भविष्य में वसंत अपने लेयरिंग सम्मेलनों के आधार पर
@Service
,@Repository
और@Repository
@Service
लिए मूल्य जोड़ने का विकल्प चुन सकता है। उस अतिरिक्त सुविधा लाभ के लिए सम्मेलन का सम्मान करना और परतों के साथ उन्हें उपयोग करना बेहतर है। - उपर्युक्त के अलावा, स्कैन-ऑटो-डिटेक्शन के
@Component
,@Service
@@Component
,@Service
,@Repository
@Service
,@Repository
@Service
लिए निर्भरता इंजेक्शन समान हैं। - वसंत दस्तावेज़ीकरण के अनुसार: @ रिपोजिटरी एनोटेशन किसी भी वर्ग के लिए एक मार्कर है जो एक भंडार की भूमिका या स्टीरियोटाइप (डेटा एक्सेस ऑब्जेक्ट या डीएओ के रूप में भी जाना जाता है) को पूरा करता है। इस मार्कर के उपयोगों में सेक्शन 20.2.2, "अपवाद अनुवाद" में वर्णित अपवादों का स्वचालित अनुवाद है। वसंत आगे की रूढ़िवादी टिप्पणियां प्रदान करता है: @ कॉम्पोनेंट, @ सेवा, और @ नियंत्रक । @ कॉम्पोनेंट किसी भी स्प्रिंग-प्रबंधित घटक के लिए एक सामान्य स्टीरियोटाइप है । @ रिपोजिटरी, @ सेवा, और @ नियंत्रक अधिक विशिष्ट उपयोग मामलों के लिए @ कॉम्पोनेंट के क्रमिकरण हैं , उदाहरण के लिए, क्रमशः दृढ़ता, सेवा और प्रस्तुति परतों में। इसलिए, आप अपने घटक वर्गों को @ कॉम्पोनेंट के साथ एनोटेट कर सकते हैं, लेकिन उन्हें @Repository, @Service, या @Controller के साथ एनोटेट करके, आपकी कक्षाएं उपकरण द्वारा प्रसंस्करण या पहलुओं के साथ संबद्ध होने के लिए अधिक उपयुक्त हैं। उदाहरण के लिए, इन स्टीरियोटाइप एनोटेशन पॉइंटकूट के लिए आदर्श लक्ष्य बनाते हैं। यह भी संभव है कि @ रिपोजिटरी, @ सेवा, और @ नियंत्रक स्प्रिंग फ्रेमवर्क के भावी रिलीज में अतिरिक्त अर्थशास्त्र ले सकते हैं। इस प्रकार, यदि आप अपनी सेवा परत के लिए @ कॉम्पोनेंट या @ सेवा का उपयोग करने के बीच चयन कर रहे हैं, तो @ सेवा स्पष्ट रूप से बेहतर विकल्प है। इसी तरह, जैसा ऊपर बताया गया है, @Repository पहले से ही आपकी दृढ़ता परत में स्वचालित अपवाद अनुवाद के लिए मार्कर के रूप में समर्थित है।
@ कॉम्पोनेंट बराबर है
<bean>
@ सेवा, @ नियंत्रक, @ रिपोजिटरी = {@ कॉम्पोनेंट + कुछ और विशेष कार्यक्षमता}
इसका मतलब है सेवा, नियंत्रक और रिपोजिटरी कार्यात्मक रूप से वही हैं।
तीन एनोटेशन का उपयोग आपके आवेदन में "परतें" को अलग करने के लिए किया जाता है,
- नियंत्रक बस प्रेषण, अग्रेषण, सेवा विधियों आदि जैसे सामान करते हैं।
- सर्विस होल्ड बिजनेस लॉजिक, कैलकुलेशन इत्यादि।
- रिपोजिटरी डीएओ (डेटा एक्सेस ऑब्जेक्ट्स) हैं, वे सीधे डेटाबेस तक पहुंचते हैं।
अब आप पूछ सकते हैं कि उन्हें अलग क्यों करें: (मुझे लगता है कि आप एओपी-आस्पेक्ट ओरिएंटेड प्रोग्रामिंग जानते हैं)
मान लें कि आप केवल डीएओ परत की गतिविधि पर नज़र रखना चाहते हैं। आप एक आस्पेक्ट (ए क्लास) कक्षा लिखेंगे जो आपके डीएओ की हर विधि के पहले और बाद में लॉगिंग करता है, आप एओपी का उपयोग करके ऐसा करने में सक्षम हैं क्योंकि आपके पास तीन अलग-अलग परतें हैं और मिश्रित नहीं हैं।
तो आप डीएओ विधियों के "डीएओ", "पहले" या "बाद" के लॉगिंग कर सकते हैं। आप ऐसा कर सकते हैं क्योंकि आपके पास पहले स्थान पर डीएओ था। जो आपने अभी हासिल किया है वह चिंताओं या कार्यों का पृथक्करण है।
कल्पना करें कि अगर केवल एक एनोटेशन @ कंट्रोलर था, तो इस घटक में प्रेषण, व्यवसाय तर्क और सभी मिश्रित डेटाबेस तक पहुंच होगी, इसलिए गंदे कोड!
ऊपर उल्लिखित एक बहुत ही आम परिदृश्य है, तीन एनोटेशन का उपयोग करने के कई और मामले हैं।
@ घटक, @ सेवा, @ नियंत्रक, @ रिपोजिटरी के बीच कोई अंतर नहीं है। @ कॉम्पोनेंट हमारे एमवीसी के घटक का प्रतिनिधित्व करने के लिए जेनेरिक एनोटेशन है। लेकिन हमारे एमवीसी अनुप्रयोग जैसे सेवा परत घटकों, दृढ़ता परत घटकों और प्रस्तुति परत घटकों के हिस्से के रूप में कई घटक होंगे। तो उन्हें अलग करने के लिए वसंत लोगों ने अन्य तीन एनोटेशन भी दिए हैं।
दृढ़ता परत घटकों का प्रतिनिधित्व करने के लिए: @ रिपोजिटरी
सेवा परत घटकों का प्रतिनिधित्व करने के लिए: @ सेवा
प्रस्तुति परत घटकों का प्रतिनिधित्व करने के लिए: @ नियंत्रक
अन्यथा आप उन सभी के लिए @ कॉम्पोनेंट का उपयोग कर सकते हैं।
चूंकि कई उत्तरों पहले से ही बताते हैं कि इन एनोटेशन का उपयोग किस प्रकार किया जाता है, हम यहां उनके बीच कुछ मामूली मतभेदों पर ध्यान केंद्रित करेंगे।
सबसे पहले समानता
फिर से हाइलाइट करने का पहला बिंदु यह है कि बीनडिफिनिशन के लिए स्कैन-ऑटो-डिटेक्शन और निर्भरता इंजेक्शन के संबंध में इन सभी एनोटेशन (जैसे। @ कॉम्पोनेंट, @ सेवा, @ रिपोजिटरी, @ कंट्रोलर) समान हैं। हम एक दूसरे के स्थान पर एक का उपयोग कर सकते हैं और अभी भी अपना रास्ता प्राप्त कर सकते हैं।
@ कॉम्पोनेंट, @ रिपोजिटरी, @ कंट्रोलर और @ सेवा के बीच मतभेद
@Component
यह एक सामान्य उद्देश्य वाली स्टीरियोटाइप एनोटेशन है जो दर्शाता है कि कक्षा एक वसंत घटक है।
@ कॉम्पोनेंट के बारे में क्या खास है
<context:component-scan>
केवल @Component
स्कैन करता है और सामान्य रूप से @Repository
@Service
, @Service
और @Repository
@Service
तलाश नहीं करता है। वे स्कैन किए गए हैं क्योंकि वे स्वयं @Component
साथ @Component
।
बस @Service
, @Service
और @Repository
एनोटेशन परिभाषाओं पर एक नज़र डालें:
@Component
public @interface Service {
….
}
@Component
public @interface Repository {
….
}
@Component
public @interface Controller {
…
}
इस प्रकार, यह कहना गलत नहीं है कि @Service
, @Service
और @Repository
@Component
@ @Component
एनोटेशन के विशेष प्रकार हैं। <context:component-scan>
उन्हें उठाता है और बीन्स के रूप में उनके निम्नलिखित वर्गों को पंजीकृत करता है, जैसे कि उन्हें @Component
साथ एनोटेट किया गया @Component
।
वे स्कैन किए गए हैं क्योंकि वे स्वयं @Component
एनोटेशन के साथ @Component
हैं। अगर हम अपनी खुद की कस्टम एनोटेशन को परिभाषित करते हैं और इसे @Component
साथ एनोटेट करते हैं, तो यह <context:component-scan>
साथ स्कैन भी हो जाएगा
@Repository
यह इंगित करना है कि कक्षा डेटा भंडार को परिभाषित करती है।
@ रिपोजिटरी के बारे में क्या खास है?
यह इंगित करने के अलावा कि यह एक एनोटेशन आधारित कॉन्फ़िगरेशन है , @Repository
का काम प्लेटफ़ॉर्म विशिष्ट अपवादों को पकड़ना है और उन्हें स्प्रिंग के एकीकृत अनचेक अपवाद के रूप में फिर से फेंकना है। और इसके लिए, हमें PersistenceExceptionTranslationPostProcessor
साथ प्रदान किया जाता है, हमें इस तरह के हमारे वसंत के एप्लिकेशन संदर्भ में जोड़ना होगा:
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
यह बीन पोस्ट प्रोसेसर किसी भी बीन के सलाहकार को जोड़ता है जिसे @Repository
साथ एनोटेट किया @Repository
ताकि किसी भी प्लेटफ़ॉर्म-विशिष्ट अपवाद पकड़े जा सकें और फिर स्प्रिंग के अनचेक डेटा एक्सेस अपवादों में से एक के रूप में पुनर्स्थापित हो जाएं।
@Controller
@ नियंत्रक एनोटेशन इंगित करता है कि एक विशेष वर्ग नियंत्रक की भूमिका निभाता है। @ @Controller
एनोटेशन एनोटेटेड क्लास के लिए एक स्टीरियोटाइप के रूप में कार्य करता है, जो इसकी भूमिका का संकेत देता है।
@ नियंत्रक के बारे में क्या खास है?
हम इस एनोटेशन को किसी भी अन्य @Service
या @Repository
साथ स्विच नहीं कर सकते हैं, भले ही वे समान दिखें। प्रेषक @ @Controller
साथ एनोटेटेड कक्षाओं को स्कैन करता है और उनके भीतर @RequestMapping
एनोटेशन का पता लगाता है। हम केवल @RequestMapping
@Controller
एनोटेटेड कक्षाओं पर @Controller
उपयोग कर सकते हैं।
@सर्विस
@Services
में रिपोजिटरी परत में व्यवसाय तर्क और कॉल विधि है।
@ सेवा के बारे में क्या खास है?
इस तथ्य के अलावा कि इसका उपयोग यह इंगित करने के लिए किया जाता है कि यह व्यवसाय तर्क धारण कर रहा है, इस टिप्पणी में कोई उल्लेखनीय विशेषता नहीं है कि यह एनोटेशन प्रदान करता है, लेकिन कौन जानता है, वसंत भविष्य में कुछ अतिरिक्त असाधारण जोड़ सकता है।
और क्या?
उपरोक्त की तरह, भविष्य में वसंत @Repository
लेयरिंग कन्वेंशन के आधार पर @Service
, @Repository
और @Repository
@Service
लिए विशेष कार्यक्षमताओं को जोड़ना चुन सकता है। इसलिए यह हमेशा सम्मेलन का सम्मान करने और परतों के अनुरूप उन्हें उपयोग करने का एक अच्छा विचार है।
डेटाबेस कनेक्शन परिप्रेक्ष्य से @Service
और @Repository
एनोटेशन का उपयोग महत्वपूर्ण है।
- अपने सभी वेब सेवा प्रकार के डीबी कनेक्शन के लिए
@Service
सेवा का उपयोग करें - अपने सभी संग्रहीत
@Repository
डीबी कनेक्शन के लिए@Repository
उपयोग करें
यदि आप उचित एनोटेशन का उपयोग नहीं करते हैं, तो आपको रोलबैक लेनदेन द्वारा ओवरराइड किए गए अपवादों का सामना करना पड़ सकता है। आपको तनाव भार परीक्षण के दौरान अपवाद दिखाई देंगे जो रोल बैक जेडीबीसी लेनदेन से संबंधित है।
यहां तक कि यदि हम @ कॉम्पोनेंट या @ रिपोजिटरी या @ सेवा का आदान-प्रदान करते हैं
यह वही व्यवहार करेगा, लेकिन एक पहलू यह है कि यदि वे घटक या @ सेवा का उपयोग करते हैं तो वे रिपोजिटरी के बजाय डीएओ से संबंधित कुछ विशिष्ट अपवाद को पकड़ने में सक्षम नहीं होंगे
ये सभी एनोटेशन स्टीरियो प्रकार के एनोटेशन के प्रकार हैं, इन तीन एनोटेशन के बीच का अंतर है
- यदि हम @ कॉम्पोनेंट जोड़ते हैं तो यह बताता है कि कक्षा की भूमिका एक घटक वर्ग है जिसका अर्थ है कि यह एक वर्ग है जिसमें कुछ तर्क शामिल हैं, लेकिन यह यह नहीं बताता कि एक वर्ग जिसमें विशेष रूप से व्यवसाय या दृढ़ता या नियंत्रक तर्क शामिल है, हम इसका उपयोग नहीं करते हैं सीधे इस @ कॉम्पोनेंट एनोटेशन
- अगर हम @ सेवा एनोटेशन जोड़ते हैं तो यह बताता है कि कक्षा तर्क की एक भूमिका व्यापार तर्क शामिल है
- यदि हम कक्षा के शीर्ष पर @ रिपोजिटरी जोड़ते हैं तो यह बताता है कि एक कक्षा जिसमें दृढ़ता तर्क शामिल है
- यहां @ कॉम्पोनेंट @ सेवा, @ रिपोजिटरी और @ नियंत्रक एनोटेशन के लिए आधार एनोटेशन है
उदाहरण के लिए
package com.spring.anno;
@Service
public class TestBean
{
public void m1()
{
//business code
}
}
package com.spring.anno;
@Repository
public class TestBean
{
public void update()
{
//persistence code
}
}
- जब भी हम डिफ़ॉल्ट रूप से
@Service
या@Repositroy
या@Component
एनोटेशन@Component
@@Component
एनोटेशन कक्षा के शीर्ष पर अस्तित्व में जा रहा है
वसंत @Component
, @Service
@Component
, @Service
, और @Repository
स्टीरियोटाइप एनोटेशन हैं जिनका उपयोग निम्न के लिए किया जाता है:
@Controller:
जहां प्रस्तुति पृष्ठ से आपका अनुरोध मैपिंग किया गया है यानी प्रस्तुति परत किसी भी अन्य फ़ाइल पर नहीं जाएगी जो सीधे @Controller
वर्ग पर जाती है और यदि आवश्यक हो तो विधि कॉल से पहले लिखा गया @RequestMapping
एनोटेशन में अनुरोधित पथ के लिए चेक करता है।
@Service
: सभी व्यावसायिक तर्क यहां डेटा से संबंधित गणनाएं हैं और सभी। व्यापार परत की यह एनोटेशन जिसमें हमारे उपयोगकर्ता सीधे दृढ़ता से कॉल नहीं करते हैं, इसलिए यह इस एनोटेशन का उपयोग करके इस विधि को कॉल करेगा। यह उपयोगकर्ता अनुरोध के अनुसार @ रिपोजिटरी का अनुरोध करेगा
@Repository
: यह @Repository
की पर्सिस्टेंस लेयर (डेटा एक्सेस लेयर) है जो डेटाबेस से डेटा प्राप्त करने के लिए उपयोग की जाती है। यानी सभी डेटाबेस संबंधित संचालन भंडार द्वारा किया जाता है।
@Component
- एक घटक स्टीरियोटाइप के साथ अपने अन्य घटकों (उदाहरण के लिए आरईएसटी संसाधन कक्षाओं) को एनोटेट करें।
इंगित करता है कि एक एनोटेटेड क्लास एक " component " है। एनोटेशन-आधारित कॉन्फ़िगरेशन और क्लासपाथ स्कैनिंग का उपयोग करते समय इस तरह के वर्ग ऑटो-डिटेक्शन के लिए उम्मीदवार के रूप में माना जाता है।
अन्य वर्ग-स्तरीय एनोटेशन को एक घटक की पहचान के रूप में भी माना जा सकता है, आमतौर पर एक विशेष प्रकार का घटक: उदाहरण के लिए @ रिपोजिटरी एनोटेशन या एस्पेक्टजे की @ आस्पेक्ट एनोटेशन।
वसंत @Component
, @Service
, @Repository
और @Repository
एनोटेशन का उपयोग स्प्रिंग फ्रेमवर्क में क्लासपाथ स्कैन का उपयोग करके स्वचालित बीन डिटेक्शन के लिए किया जाता है।
@Component
एक सामान्य एनोटेशन है। @Service
, @Repository
@Service
, @Repository
साथ @Component
का @Component
यह है कि वे @Component
विशेष मामले हैं और विशेष उद्देश्यों के लिए उपयोग किए जाते हैं। अंतर केवल वर्गीकरण है।
इन सभी एनोटेशन (रूढ़िवादी) के लिए, तकनीकी रूप से मुख्य उद्देश्य समान है। वसंत स्वचालित रूप से इन सभी वर्गों को स्कैन और पहचानता है जो " @Component
, @Service
, @Repository
@Service
, @Repository
@Service
" के साथ एनोटेटेड हैं और @Repository
साथ बीन परिभाषा पंजीकृत करते हैं।
वे लगभग समान हैं - उनमें से सभी का मतलब है कि कक्षा एक वसंत बीन है। @Service
, @Repository
और @Component
विशेष @Component
एस हैं। आप उनके साथ विशिष्ट कार्यवाही करने का चयन कर सकते हैं। उदाहरण के लिए:
-
@Controller
सेम वसंत-एमवीसी द्वारा उपयोग किया जाता है -
@Repository
बीन्स दृढ़ता अपवाद अनुवाद के लिए योग्य हैं
एक और बात यह है कि आप घटकों को अलग-अलग परतों में अर्थात् निर्दिष्ट करते हैं।
एक बात यह है कि @Component
ऑफ़र यह है कि आप इसके साथ अन्य टिप्पणियां एनोटेट कर सकते हैं, और फिर उन्हें @Service
जैसे ही उपयोग कर @Service
।
उदाहरण के लिए मैंने हाल ही में बनाया:
@Component
@Scope("prototype")
public @interface ScheduledJob {..}
तो @ScheduledJob
साथ एनोटेटेड सभी कक्षाएं वसंत सेम हैं और इसके अलावा क्वार्ट्ज नौकरियों के रूप में पंजीकृत हैं। आपको केवल कोड प्रदान करना होगा जो विशिष्ट एनोटेशन को संभालता है।
हम जावा मानक के अनुसार इसका उत्तर दे सकते हैं
JSR-330
जिक्र करते हुए, जो अब वसंत द्वारा समर्थित है, आप केवल बीन को परिभाषित करने के लिए @Named
कर सकते हैं (कुछ कैसे @[email protected]
)। तो इस मानक के अनुसार ऐसा लगता है कि श्रेणियों सेम में स्टीरियो प्रकार (जैसे @Repository
, @Service
@Repository
, @Service
) को परिभाषित करने के लिए कोई उपयोग नहीं है।
लेकिन वसंत उपयोगकर्ता विशिष्ट उपयोग के लिए अलग-अलग टिप्पणियों में अलग-अलग टिप्पणियां, उदाहरण के लिए:
- सक्षम डेवलपर्स को सक्षम के लिए बेहतर श्रेणी परिभाषित करने में सहायता करें। कुछ मामलों में यह वर्गीकरण उपयोगी हो सकता है। (उदाहरण के लिए जब आप
aspect oriented
का उपयोग कर रहे हैं, तो यहpoint cuts
लिए अच्छा उम्मीदवार हो सकता है) -
@Repository
एनोटेशन आपके बीन में कुछ कार्यक्षमता जोड़ देगा (आपके बीन दृढ़ता परत के लिए कुछ स्वचालित अपवाद अनुवाद)। - यदि आप वसंत एमवीसी का उपयोग कर रहे हैं, तो
@RequestMapping
केवल उन वर्गों में जोड़ा जा सकता है जिन्हें@Controller
द्वारा एनोटेट किया गया है।
@Component
is the top level generic annotation which makes the annotated bean to be scanned and available in the DI container
@Repository
is specialized annotation and it brings the feature of converting all the unchecked exceptions from the DAO classes
@Service
is specialized annotation. it do not bring any new feature as of now but it clarifies the intent of the bean
@Controller is specialized annotation which makes the bean MVC aware and allows the use of further annotation like @RequestMapping
and all such
Here are more details
@ कॉम्पोनेंट, @ सेवा और @ रिपोजिटरी के बीच का अंतर
इन रूढ़िवादों के बीच प्रमुख अंतर यह है कि वे विभिन्न वर्गीकरण के लिए उपयोग किए जाते हैं।
एक बहुआयामी आवेदन में, हमारे पास प्रेजेंटेशन, सेवा, व्यवसाय, डेटा एक्सेस इत्यादि जैसी अलग-अलग परतें होंगी। जब स्प्रिंग द्वारा ऑटो-डिटेक्शन के लिए कक्षा को एनोटेट किया जाना है, तो हमें नीचे के संबंधित स्टीरियोटाइप का उपयोग करना चाहिए।
@Component
- जेनेरिक और एप्लिकेशन में इस्तेमाल किया जा सकता है।
सेवा सेवा स्तर पर @ सेवा - एनोटेट कक्षाएं।
@Repository
- दृढ़ता परत पर एनोटेट कक्षाएं, जो डेटाबेस भंडार के रूप में कार्य करेगी।
यदि तकनीकी रूप से वे समान होने जा रहे हैं तो हमें इन्हें अलग-अलग परतों के स्तर पर क्यों उपयोग करने की आवश्यकता है। सभी परतों पर इसका उपयोग क्यों न करें। उदाहरण के लिए, यदि हम सभी परतों में @Service
का उपयोग करते हैं, तो सभी सेम तत्काल हो जाएंगे और कोई समस्या नहीं होगी। मामूली अंतर है, उदाहरण के लिए @Repository
विचार @Repository
।
पोस्टप्रोसेसर स्वचालित रूप से सभी अपवाद अनुवादकों (PersistenceExceptionTranslator इंटरफ़ेस के कार्यान्वयन) को @Repository
और @Repository
एनोटेशन के साथ चिह्नित सभी बीन्स को सलाह देता है ताकि खोजे गए अनुवादक फेंकने वाले अपवादों पर उचित अनुवाद को रोक और लागू कर सकें।
उपर्युक्त के समान, भविष्य में वसंत अपने लेयरिंग सम्मेलनों के आधार पर @Service
, @Repository
और @Repository
@Service
लिए मूल्य जोड़ने का विकल्प चुन सकता है। उस अतिरिक्त सुविधा के लिए सम्मेलन का सम्मान करना और परतों के साथ उन्हें उपयोग करना बेहतर होता है।
उपर्युक्त के अलावा, स्कैन-ऑटो-डिटेक्शन के @Component
, @Service
@ @Component
, @Service
, @Repository
@Service
, @Repository
@Service
लिए निर्भरता इंजेक्शन समान हैं।
@Component : you annotate a class @Component, it tells hibernate that it is a Bean.
@Repository : you annotate a class @Repository, it tells hibernate it is a DAO class and treat it as DAO class. Means it makes the unchecked exceptions (thrown from DAO methods) eligible for translation into Spring DataAccessException.
@Service : This tells hibernate it is a Service class where you will have @Transactional etc Service layer annotations so hibernate treats it as a Service component.
Plus @Service is advance of @Component. Assume the bean class name is CustomerService, since you did not choose XML bean configuration way so you annotated the bean with @Component to indicate it as a Bean. So while getting the bean object CustomerService cust = (CustomerService)context.getBean("customerService");
By default, Spring will lower case the first character of the component – from 'CustomerService' to 'customerService'. And you can retrieve this component with name 'customerService'. But if you use @Service annotation for the bean class you can provide a specific bean name by
@Service("AAA")
public class CustomerService{
and you can get the bean object by
CustomerService cust = (CustomerService)context.getBean("AAA");
Explanation of stereotypes :
-
@Service
- Annotate all your service classes with @Service. This layer knows the unit of work. All your business logic will be in Service classes. Generally methods of service layer are covered under transaction. You can make multiple DAO calls from service method, if one transaction fails all transactions should rollback. -
@Repository
- Annotate all your DAO classes with @Repository. All your database access logic should be in DAO classes. -
@Component
- Annotate your other components (for example REST resource classes) with component stereotype. -
@Autowired
- Let Spring auto-wire other beans into your classes using @Autowired annotation.
@Component
किसी स्प्रिंग-प्रबंधित घटक के लिए एक सामान्य स्टीरियोटाइप है। @Repository
, @Service
और अधिक विशिष्ट उपयोग मामलों @Controller
के @Component
लिए विशेषज्ञता प्राप्त कर रहे हैं , उदाहरण के लिए, क्रमशः दृढ़ता, सेवा और प्रस्तुति परतों में।
@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.
आप देखेंगे कि सभी @Repository
, @Service
या @Component
साथ @Component
। तो, क्या हम ऑटो स्कैनिंग के लिए सभी घटकों के लिए सिर्फ @Component
उपयोग कर सकते हैं? हां, आप कर सकते हैं, और वसंत स्वचालित रूप से @ कॉम्पोनेंट एनोटेटेड के साथ आपके सभी घटकों को स्कैन करेगा।
यह ठीक काम कर रहा है, लेकिन पठनीयता के लिए एक अच्छा अभ्यास नहीं है, आपको हमेशा अपने कोड को पढ़ने के लिए अधिक आसान बनाने के लिए एक निर्दिष्ट परत के लिए @Repository
, @Service
या @Service
घोषित करना चाहिए।