CodeGym/Java Blog/अनियमित/आलसी लोगों के लिए वसंत नींव, बुनियादी अवधारणाएं और कोड के...
John Squirrels
स्तर 41
San Francisco

आलसी लोगों के लिए वसंत नींव, बुनियादी अवधारणाएं और कोड के साथ उदाहरण। भाग ---- पहला

अनियमित ग्रुप में प्रकाशित
सदस्य
आलसी लोगों के लिए वसंत नींव, बुनियादी अवधारणाएं और कोड के साथ उदाहरण।  भाग 1 - 1इस लेख में, मैं आपको यह नहीं बताने जा रहा हूं कि मेरे कोड का उपयोग करके 5 मिनट में काम कर रहे स्प्रिंग प्रोजेक्ट को कैसे शुरू किया जाए। मैं केवल मूल बातें लिखने जा रहा हूं - ऐसी चीजें जिनसे आप अनभिज्ञ हो सकते हैं और फिर भी एक परियोजना बना सकते हैं। लेकिन इस लेख में आप अभी भी नहीं समझ पाएंगे कि क्या हो रहा है और इससे भी महत्वपूर्ण बात यह है कि ऐसा क्यों हो रहा है।

स्प्रिंग फ्रेमवर्क क्या है?

जावा में वेब एप्लिकेशन बनाने के लिए स्प्रिंग फ्रेमवर्क, या केवल स्प्रिंग, सबसे लोकप्रिय फ्रेमवर्क में से एक है। एक रूपरेखा एक पुस्तकालय की तरह है (शायद आप इस शब्द से अधिक परिचित हैं), लेकिन विचार करने के लिए कुछ है। मोटे तौर पर बोलते हुए, जब आप किसी लाइब्रेरी का उपयोग करते हैं, तो आप केवल उन कक्षाओं के उदाहरण बनाते हैं जिनमें यह शामिल है, आपको आवश्यक विधियों को कॉल करें, और इस प्रकार आपको आवश्यक परिणाम प्राप्त करें। दूसरे शब्दों में, यह अधिक अनिवार्य दृष्टिकोण है: आपके कार्यक्रम में, आप स्पष्ट रूप से उस विशिष्ट क्षण को इंगित करते हैं जब आपको कौन सी वस्तु बनाने की आवश्यकता होती है, कब किस विशिष्ट विधि को कॉल करना है, आदि। चौखटे के साथ, चीजें थोड़ी अलग होती हैं। आप बस अपनी खुद की कुछ कक्षाएं लिखते हैं और उनमें कुछ तर्क लिखते हैं, लेकिन फिर रूपरेखा ही आपकी कक्षाओं के उदाहरण बनाती है और उनके तरीकों को बुलाती है। आपकी कक्षाएं आमतौर पर ढांचे से कुछ इंटरफेस को लागू करती हैं या इसके कुछ वर्गों को विरासत में लेती हैं, इस प्रकार आपको कुछ कार्यक्षमता प्रदान करती हैं जो आपके लिए पहले ही लिखी जा चुकी हैं। लेकिन हमेशा ऐसा नहीं होता। उदाहरण के लिए, वसंत इस तरह के तंग युग्मन से बचने के लिए जितना संभव हो उतना प्रयास करता है (जहां आपकी कक्षाएं सीधे ढांचे में कक्षाओं/इंटरफेस पर निर्भर करती हैं)। इसे प्राप्त करने के लिए यह एनोटेशन का उपयोग करता है। हम इस पर बाद में लौटेंगे। लेकिन यह समझना महत्वपूर्ण है कि स्प्रिंग केवल उन कक्षाओं और इंटरफेस का एक संग्रह है जो आपके उपयोग के लिए उपलब्ध हैं :) मैं तुरंत यह भी नोट करना चाहता हूं कि स्प्रिंग का उपयोग न केवल वेब अनुप्रयोगों के लिए किया जा सकता है, बल्कि सबसे आम कंसोल प्रोग्रामों के लिए भी किया जा सकता है। जिससे हम सभी परिचित हैं। और आज हम उनमें से एक लिखेंगे। इस प्रकार आपको कुछ कार्यक्षमता प्रदान करता है जो आपके लिए पहले ही लिखी जा चुकी है। लेकिन हमेशा ऐसा नहीं होता। उदाहरण के लिए, वसंत इस तरह के तंग युग्मन से बचने के लिए जितना संभव हो उतना प्रयास करता है (जहां आपकी कक्षाएं सीधे ढांचे में कक्षाओं/इंटरफेस पर निर्भर करती हैं)। इसे प्राप्त करने के लिए यह एनोटेशन का उपयोग करता है। हम इस पर बाद में लौटेंगे। लेकिन यह समझना महत्वपूर्ण है कि स्प्रिंग केवल उन कक्षाओं और इंटरफेस का एक संग्रह है जो आपके उपयोग के लिए उपलब्ध हैं :) मैं तुरंत यह भी नोट करना चाहता हूं कि स्प्रिंग का उपयोग न केवल वेब अनुप्रयोगों के लिए किया जा सकता है, बल्कि सबसे आम कंसोल प्रोग्रामों के लिए भी किया जा सकता है। जिससे हम सभी परिचित हैं। और आज हम उनमें से एक लिखेंगे। इस प्रकार आपको कुछ कार्यक्षमता प्रदान करता है जो आपके लिए पहले ही लिखी जा चुकी है। लेकिन हमेशा ऐसा नहीं होता। उदाहरण के लिए, वसंत इस तरह के तंग युग्मन से बचने के लिए जितना संभव हो उतना प्रयास करता है (जहां आपकी कक्षाएं सीधे ढांचे में कक्षाओं/इंटरफेस पर निर्भर करती हैं)। इसे प्राप्त करने के लिए यह एनोटेशन का उपयोग करता है। हम इस पर बाद में लौटेंगे। लेकिन यह समझना महत्वपूर्ण है कि स्प्रिंग केवल उन कक्षाओं और इंटरफेस का एक संग्रह है जो आपके उपयोग के लिए उपलब्ध हैं :) मैं तुरंत यह भी नोट करना चाहता हूं कि स्प्रिंग का उपयोग न केवल वेब अनुप्रयोगों के लिए किया जा सकता है, बल्कि सबसे आम कंसोल प्रोग्रामों के लिए भी किया जा सकता है। जिससे हम सभी परिचित हैं। और आज हम उनमें से एक लिखेंगे। वसंत इस तरह के तंग युग्मन से बचने के लिए यथासंभव प्रयास करता है (जहां आपकी कक्षाएं सीधे ढांचे में कक्षाओं/इंटरफेस पर निर्भर करती हैं)। इसे प्राप्त करने के लिए यह एनोटेशन का उपयोग करता है। हम इस पर बाद में लौटेंगे। लेकिन यह समझना महत्वपूर्ण है कि स्प्रिंग केवल उन कक्षाओं और इंटरफेस का एक संग्रह है जो आपके उपयोग के लिए उपलब्ध हैं :) मैं तुरंत यह भी नोट करना चाहता हूं कि स्प्रिंग का उपयोग न केवल वेब अनुप्रयोगों के लिए किया जा सकता है, बल्कि सबसे आम कंसोल प्रोग्रामों के लिए भी किया जा सकता है। जिससे हम सभी परिचित हैं। और आज हम उनमें से एक लिखेंगे। वसंत इस तरह के तंग युग्मन से बचने के लिए यथासंभव प्रयास करता है (जहां आपकी कक्षाएं सीधे ढांचे में कक्षाओं/इंटरफेस पर निर्भर करती हैं)। इसे प्राप्त करने के लिए यह एनोटेशन का उपयोग करता है। हम इस पर बाद में लौटेंगे। लेकिन यह समझना महत्वपूर्ण है कि स्प्रिंग केवल उन कक्षाओं और इंटरफेस का एक संग्रह है जो आपके उपयोग के लिए उपलब्ध हैं :) मैं तुरंत यह भी नोट करना चाहता हूं कि स्प्रिंग का उपयोग न केवल वेब अनुप्रयोगों के लिए किया जा सकता है, बल्कि सबसे आम कंसोल प्रोग्रामों के लिए भी किया जा सकता है। जिससे हम सभी परिचित हैं। और आज हम उनमें से एक लिखेंगे। ) मैं तुरंत यह भी नोट करना चाहता हूं कि स्प्रिंग का उपयोग न केवल वेब एप्लिकेशन के लिए किया जा सकता है, बल्कि सबसे सामान्य कंसोल प्रोग्राम के लिए भी किया जा सकता है जो हम सभी से परिचित हैं। और आज हम उनमें से एक लिखेंगे। ) मैं तुरंत यह भी नोट करना चाहता हूं कि स्प्रिंग का उपयोग न केवल वेब एप्लिकेशन के लिए किया जा सकता है, बल्कि सबसे सामान्य कंसोल प्रोग्राम के लिए भी किया जा सकता है जो हम सभी से परिचित हैं। और आज हम उनमें से एक लिखेंगे।

संरचना

लेकिन वसंत सिर्फ एक विशेष ढांचा नहीं है। बल्कि, यह एक सामान्य नाम है जिसका उपयोग कई छोटे ढाँचों को संदर्भित करने के लिए किया जाता है, जिनमें से प्रत्येक अपनी तरह का काम करता है। आलसी लोगों के लिए वसंत नींव, बुनियादी अवधारणाएं और कोड के साथ उदाहरण।  भाग 1 - 2

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
चित्र 2.1। स्प्रिंग फ्रेमवर्क का अवलोकन

जैसा कि आप देख सकते हैं, वसंत मॉड्यूलर है। यह हमें केवल उन मॉड्यूलों को कनेक्ट करने देता है जिनकी हमें अपने एप्लिकेशन के लिए आवश्यकता होती है और उन्हें कनेक्ट नहीं करता है जिनका हम स्पष्ट रूप से उपयोग नहीं करेंगे। जहाँ तक मुझे पता है, यह वह दृष्टिकोण था जिसने स्प्रिंग को अपने तत्कालीन प्रतियोगी (EJB) से बेहतर प्रदर्शन करने दिया और बढ़त बना ली। EJB का उपयोग करने वाले एप्लिकेशन ने अपने पीछे बहुत सारी निर्भरताएँ खींच लीं, और परिणामस्वरूप, वे सुस्त और धीमे हो गए। छवि से पता चलता है कि स्प्रिंग फ्रेमवर्क में कई मॉड्यूल शामिल हैं:
  • डेटा प्राप्त करना
  • वेब
  • मुख्य
  • और अधिक
आज हम मुख्य मॉड्यूल में पाई जाने वाली कुछ अवधारणाओं से परिचित होंगे: बीन्स, संदर्भ और अन्य। जैसा कि आपने अनुमान लगाया होगा, डेटा एक्सेस मॉड्यूल में डेटा (मुख्य रूप से डेटाबेस) के साथ काम करने के लिए उपकरण होते हैं, और वेब मॉड्यूल एक नेटवर्क पर काम करने के लिए होता है (वेब ​​एप्लिकेशन बनाने सहित, जिस पर बाद में चर्चा की जाएगी)। इसके अलावा, एक व्यापक बुनियादी ढाँचा है जो स्प्रिंग का समर्थन करता है: कई अन्य परियोजनाएँ जो आधिकारिक तौर पर स्वयं फ्रेमवर्क में शामिल नहीं हैं, लेकिन आपके स्प्रिंग प्रोजेक्ट में मूल रूप से एकीकृत हैं (उदाहरण के लिए, स्प्रिंग सिक्योरिटी, जिसे मैं भी छूने की उम्मीद करता हूं, के लिए है एक वेबसाइट पर एक उपयोगकर्ता को प्रमाणित करना)।

जावा में स्प्रिंग फ्रेमवर्क क्यों है?

ठीक है, इस तथ्य के अलावा कि यह फैशनेबल, स्लीक और ताज़ा है, मैं अभी कह सकता हूं कि जैसे ही आप स्प्रिंग का उपयोग करके थोड़ी सी भी कुशलता प्राप्त कर लेते हैं, आप समझ जाएंगे कि कैसे सभी प्रकार के काम हैं जो अब आपके पास नहीं हैं करने के लिए, और वसंत अपने आप में कितना काम करता है। आप कॉन्फ़िगरेशन सेटिंग्स की कुछ दर्जन पंक्तियाँ लिख सकते हैं और कुछ कक्षाएं लिख सकते हैं, और आप एक कार्यशील परियोजना के साथ समाप्त हो जाते हैं। लेकिन जैसे ही आप यह सोचना शुरू करते हैं कि हुड के नीचे कितना सामान है, कितना काम किया जा रहा है, और यदि आप सादे सर्वलेट या सॉकेट और शुद्ध जावा के आधार पर एक ही प्रोजेक्ट को लागू करने जा रहे हैं तो आपको कितना कोड लिखना होगा, आपके रोंगटे खड़े हो जाएंगे :) वसंत को एक तरह के जादू के रूप में भी वर्णित किया गया है। आप इसका अनुभव तब करते हैं जब आप देखते हैं कि सब कुछ काम करता है, लेकिन आपको इस बात का भी अंदाजा है कि पर्दे के पीछे कैसे और कितना काम हो रहा है - तो ऐसा लगता है कि वास्तव में किसी तरह का जादू है :) :) वसंत का अध्ययन करने के पक्ष में दूसरा तर्क यह है कि जूनियर डेवलपर्स (मेरी व्यक्तिगत टिप्पणियों के आधार पर) के लिए लगभग 90% नौकरी के उद्घाटन के लिए या तो ज्ञान की आवश्यकता होती है या कम से कम वसंत के बारे में एक सामान्य विचार की आवश्यकता होती है।Data, Web MVC, और Securityमॉड्यूल परिष्कृत डेवलपर्स प्रदान करते हैं :) लेकिन आज केवल मूल बातें हैं।

डीआई/आईओसी

यदि आपने कभी स्प्रिंग के बारे में पढ़ने की कोशिश की है, तो पहली चीज़ जो आपने देखी है वह शायद ये संक्षिप्त शब्द थे: DI/IoC। अब मैं अत्यधिक अनुशंसा करता हूं कि आप इस लेख से विराम लें और इस DZone लेख को पढ़ें ! IoC, नियंत्रण का व्युत्क्रम के लिए खड़ा है। जब मैंने लिखा था कि मैंने पहले ही इसका उल्लेख किया है कि एक पुस्तकालय का उपयोग करने से आप स्वयं अपने कोड में इंगित करते हैं कि किस वस्तु पर कॉल करने की विधि है, लेकिन एक ढांचे का उपयोग करने का आम तौर पर मतलब है कि ढांचा आपके कोड को सही समय पर कॉल करेगा। दूसरे शब्दों में, इस बाद वाले मामले में, अब आप कोड/प्रोग्राम को निष्पादित करने की प्रक्रिया का प्रबंधन नहीं कर रहे हैं - ढांचा आपके लिए यह करता है। आपने ढांचे पर नियंत्रण पारित किया (नियंत्रण का उलटा)। DI, निर्भरता इंजेक्शन के लिए खड़ा है. डिपेंडेंसी इंजेक्शन के साथ, आप main मेथड में कैट ऑब्जेक्ट नहीं बनाते हैं और फिर उन्हें अपने मेथड में पास करते हैं। इसके बजाय, स्प्रिंग फ्रेमवर्क उन्हें आपके लिए बनाता है। आप बस कुछ ऐसा कहते हैं जैसे "मैं यहां एक बिल्ली प्राप्त करना चाहता हूं" और ढांचा आपके तरीके से आपको पास करता है। हम इस संक्षिप्त नाम को भविष्य के लेखों में देखेंगे।

बीन्स और संदर्भ

वसंत में प्रमुख अवधारणाओं में से एक बीन है। वास्तव में, यह केवल किसी वर्ग की वस्तु है। मान लीजिए कि हमारे पास एक प्रोग्राम है जिसके लिए 3 वस्तुओं की आवश्यकता है: एक बिल्ली, एक कुत्ता और एक तोता। और हमारे पास विधियों के एक समूह के साथ कक्षाओं का एक समूह है। कभी-कभी हमें एक विधि के लिए एक बिल्ली की आवश्यकता होती है, कभी-कभी हमें एक अलग विधि के लिए एक कुत्ते की आवश्यकता होती है, और कभी-कभी हमारे तरीकों के लिए बिल्ली और तोता दोनों की आवश्यकता होती है (उदाहरण के लिए, बिल्ली को खिलाने की विधि, हा-हा)। अभी भी अन्य तरीकों के लिए, तीनों वस्तुओं की आवश्यकता है। हां, हम पहले इन तीन वस्तुओं को मुख्य विधि में बना सकते हैं, और फिर उन्हें अपनी कक्षाओं में पास कर सकते हैं, और फिर इन कक्षाओं में उन्हें संबंधित विधियों में पास कर सकते हैं... और इसी तरह पूरे कार्यक्रम में। लेकिन अगर हम यह भी मानते हैं कि हम कभी-कभी अपने तरीकों के लिए इनपुट मापदंडों की सूची बदलना चाहते हैं (उदाहरण के लिए, हम कुछ फिर से लिखने या नई कार्यक्षमता जोड़ने का निर्णय लेते हैं), तो हमें कोड में कुछ बदलाव करने होंगे। और अब कल्पना कीजिए कि हमारे पास 3 नहीं, बल्कि 300 ऐसी वस्तुएं हैं। एक विकल्प हमारी सभी वस्तुओं को एक सूची में इकट्ठा करना होगा (List<Object>), इसे हर विधि में पास करें, और फिर विधियों के अंदर आवश्यक वस्तु प्राप्त करें। लेकिन जैसा कि कार्यक्रम चलता है, क्या होगा यदि इस सूची में कुछ वस्तु जोड़ दी जाए, या इससे भी बदतर, क्या होगा यदि कोई हटा दिया जाए? इसमें प्रत्येक विधि को तोड़ने की क्षमता है जहां हम सूची से ऑब्जेक्ट प्राप्त करने के लिए इंडेक्स का उपयोग करते हैं। इस समस्या से बचने के लिए, हम अपनी वस्तुओं को एक सूची में नहीं, बल्कि एक मानचित्र में संग्रहीत करने का निर्णय लेते हैं, जहाँ कुंजी वस्तु का नाम है और मूल्य ही वस्तु है। यह हमें उन वस्तुओं को पुनः प्राप्त करने की अनुमति देता है जिनकी हमें केवल उनके नाम का उपयोग करके आवश्यकता होती है, उदाहरण के लिए get("parrot"), और प्रतिक्रिया में हमें तोता वस्तु मिलती है। या कुंजी वस्तु का वर्ग हो सकता है, और मूल्य वस्तु ही हो सकता है। इस मामले में, वस्तु का नाम निर्दिष्ट करने के बजाय, हम केवल उस वस्तु के वर्ग को निर्दिष्ट कर सकते हैं जिसकी हमें आवश्यकता है। यह सुविधाजनक भी है। या हम मानचित्र के लिए किसी प्रकार का आवरण भी लिख सकते हैं, जहाँ कुछ विधियाँ उनके नाम से वस्तुएँ प्राप्त करती हैं, और अन्य विधियाँ उनकी कक्षा द्वारा वस्तुएँ प्राप्त करती हैं। हम यहां जो पहुंचे हैं उसे एक कहा जाता हैस्प्रिंग फ्रेमवर्क में अनुप्रयोग संदर्भ । एक संदर्भ सेम (वस्तुओं) का एक संग्रह है। हम बीन (ऑब्जेक्ट) को उसके नाम, उसके प्रकार, या किसी अन्य माध्यम से प्राप्त करने के लिए एक संदर्भ तक पहुँचते हैं। इसके अतिरिक्त, हम स्प्रिंग को स्वयं अपने संदर्भ में उस बीन की तलाश करने के लिए कह सकते हैं जिसकी हमें आवश्यकता है और इसे हमारी विधि में पास करें। उदाहरण के लिए, मान लीजिए कि हमारे पास इस तरह की एक विधि थी:
public void doSomething(Cat cat) {
    ...
}
जब स्प्रिंग ने इस विधि को कॉल किया, तो इसने हमारी बिल्ली की वस्तु को उसके संदर्भ से लिया और इसे विधि में पारित कर दिया। लेकिन अब हमने तय किया है कि बिल्ली के अलावा हमारे तरीके को तोते की भी जरूरत है। वसंत के साथ, कुछ भी आसान नहीं हो सकता! हम बस लिखते हैं:
public void doSomething(Cat cat, Parrot parrot) {
    ...
}
अब जब स्प्रिंग हमारी पद्धति को बुलाता है, तो वह बिल्ली और तोते को पास करने की आवश्यकता को समझता है, इसलिए वह इसके संदर्भ में जाता है, इन दो वस्तुओं को प्राप्त करता है, और उन्हें हमारी पद्धति में भेजता है। नियंत्रण की बागडोर स्प्रिंग को हस्तांतरित करके, हम वस्तुओं को बनाने और उन्हें अपने तरीकों से पारित करने की जिम्मेदारी भी हस्तांतरित करते हैं, जिसे स्प्रिंग कॉल करेगा। यह सवाल पूछता है: स्प्रिंग को कैसे पता चलता है कि कौन सी वस्तुएं (बीन्स) बनानी हैं?

एप्लिकेशन को कॉन्फ़िगर करने के तरीके

एप्लिकेशन को कॉन्फ़िगर करने के तीन मुख्य तरीके हैं , अर्थात्, स्प्रिंग को यह बताने के तरीके कि वास्तव में हमें किन वस्तुओं की आवश्यकता है:
  1. एक्सएमएल कॉन्फ़िगरेशन फ़ाइलें
  2. जावा-आधारित कॉन्फ़िगरेशन
  3. स्वचालित विन्यास
वसंत के निर्माता उन्हें इस क्रम में प्राथमिकता देते हैं:
  • सर्वोच्च प्राथमिकता वाली विधि, जिसे प्राथमिकता दी जानी चाहिए, स्वचालित कॉन्फ़िगरेशन है
  • यदि स्वचालित कॉन्फ़िगरेशन का उपयोग सभी संभावित बीन्स को सही ढंग से कॉन्फ़िगर करने के लिए नहीं किया जा सकता है, तो जावा-आधारित कॉन्फ़िगरेशन का उपयोग करें (जिसमें जावा कोड का उपयोग करके ऑब्जेक्ट बनाना शामिल है)
  • और सबसे कम-प्राथमिकता वाली विधि पुराने ढंग का तरीका है - XML ​​कॉन्फ़िगरेशन फ़ाइलों का उपयोग करना।
स्प्रिंग हमें इन विधियों को संयोजित करने की सुविधा भी देता है। उदाहरण के लिए, स्प्रिंग को वह सब कुछ कॉन्फ़िगर करने दें जो स्वचालित रूप से कॉन्फ़िगर किया जा सकता है, जहाँ भी आपको विशेष पैरामीटर की आवश्यकता हो, जावा-आधारित कॉन्फ़िगरेशन का उपयोग करें और किसी भी पुराने कॉन्फ़िगरेशन के लिए XML का उपयोग करें। यह सब काफी लचीला होता है। फिर भी, अगर सब कुछ स्वचालित रूप से कॉन्फ़िगर किया जा सकता है, तो वह विकल्प चुनें। मैं केवल स्वचालित कॉन्फ़िगरेशन और जावा-आधारित कॉन्फ़िगरेशन पर विचार करूंगा। इंटरनेट पर स्प्रिंग के लगभग हर उदाहरण में XML कॉन्फ़िगरेशन का उपयोग किया जाता है। इतना ही नहीं, एक बार जब आप समझ जाते हैं कि जावा-आधारित कॉन्फ़िगरेशन कैसे काम करता है, तो आपको एक ही काम करने वाली XML फ़ाइल पढ़ने में कोई समस्या नहीं होनी चाहिए। स्वचालित कॉन्फ़िगरेशन का उपयोग तब किया जाता है जब हमें अपने द्वारा लिखी गई कक्षाओं की वस्तुओं के साथ काम करने की आवश्यकता होती है। अगर हमारे किसी ऑब्जेक्ट को बनाने के लिए कुछ बहुत विशिष्ट तर्क की आवश्यकता होती है, या यदि हम स्वचालित कॉन्फ़िगरेशन के लिए आवश्यक एनोटेशन के साथ कुछ वर्ग बनाने में असमर्थ हैं, तो हम जावा-आधारित कॉन्फ़िगरेशन का उपयोग कर सकते हैं जो करने की आवश्यकता है। मेंअगले भाग में , हम एक मावेन प्रोजेक्ट बनाएंगे, कुछ मुख्य स्प्रिंग मॉड्यूल को कनेक्ट करेंगे और अपना पहला बीन्स बनाएंगे।
टिप्पणियां
  • लोकप्रिय
  • नया
  • पुराना
टिप्पणी लिखने के लिए आपको साइन इन करना होगा
इस पेज पर अभी तक कोई टिप्पणियां नहीं हैं