दिलचस्प पोस्ट
स्ट्रिंग में दोहरे उद्धरणों से बचने के लिए कैसे? संबंधित tnsnames.ora फ़ाइल का स्थान निर्धारित करना क्रॉस-डोमेन कुकीज कैसे ककड़ी सुविधा फ़ाइल समानांतर को निष्पादित करें एसक्यूएल WHERE क्लॉज शॉर्ट-सर्किट मूल्यांकन क्या है? C ++ 11 में N- तत्व constexpr सरणी बनाएँ सेवा से एक संवाद प्रदर्शित करने के तरीके MongoDB-CR प्रमाणीकरण विफल हुआ हो सकता है कि एक से वापसी पर ऑपरेटिंग जिसमें "बस" अक्षम विशेषता के लिए सही मान एक पूर्णांक प्रभाग में अंश कैसे प्राप्त करें? PHP कीवर्ड 'var' क्या करता है? इनपुट टैग के अंदर HTML नाम विशेषता में कौन-से पात्रों की अनुमति है? विभिन्न उत्पाद स्वादों के लिए विभिन्न निर्भरता को परिभाषित करने के तरीके Mysqli में कई मूल्यों का सबसे अच्छा तरीका है?

बीन इनिशियलाइजेशन पूरा होने के बाद किसी विधि को कैसे कॉल करें?

मेरे पास उपयोग के मामले हैं जहां मुझे बीन में एक (गैर-स्थिर) विधि कॉल करने की आवश्यकता होती है, केवल एक बार जब ApplicationContext लोड हो जाता है। क्या यह ठीक है, अगर मैं इसके लिए MethodInvokingFactoryBean का उपयोग करता हूँ? या हमारे पास कुछ बेहतर समाधान है?

एक साइड नोट के रूप में, मैं वेब अनुप्रयोग में अनुप्रयोग संदर्भ को लोड करने के लिए ConfigContextLoaderListener का उपयोग करता हूं। और चाहें, कि यदि बीन 'ए' तत्काल होता है तो केवल एक विधि 'ए' को कॉल करें।

यह कैसे अच्छी तरह से किया जा सकता है?

वेब के समाधान से एकत्रित समाधान "बीन इनिशियलाइजेशन पूरा होने के बाद किसी विधि को कैसे कॉल करें?"

आप की तरह कुछ का उपयोग कर सकते हैं:

<beans> <bean id="myBean" class="..." init-method="init"/> </beans> 

यह "init" विधि को कॉल करेगा जब बीन को तत्काल किया जाएगा।

अन्य उत्तरों में @PostConstruct सुझाव पर विस्तार करने के लिए, यह वास्तव में सबसे अच्छा समाधान है, मेरी राय में

  • यह आपके कोड को स्प्रिंग एपीआई से डिकॉप्ल्ड रखता है (@PostConstruct javax में है। *)
  • यह स्पष्ट रूप से आपके init विधि को कुछ के रूप में टिप्पणी करता है जिसे बीन को इनिशियलाइज़ करने के लिए बुलाया जाना चाहिए
  • आपको अपने स्प्रिंग बीन की परिभाषा में init-method विशेषता को जोड़ने के लिए याद रखने की आवश्यकता नहीं है, स्प्रिंग स्वचालित रूप से विधि को बुलाता है (मानते हुए कि आप संदर्भ में किसी और स्थान पर, किसी भी प्रकार, किसी भी रूप में रजिस्टर कर सकते हैं)।

संदर्भ में वर्णित अनुसार, विचार करने के लिए तीन अलग-अलग दृष्टिकोण हैं

Init-method विशेषता का उपयोग करें

पेशेवरों:

  • अंतरफलक को लागू करने के लिए बीन की आवश्यकता नहीं है

विपक्ष:

  • कोई तत्काल संकेत इस विधि का निर्माण करने के बाद आवश्यक है ताकि यह सुनिश्चित किया जा सके कि बीन ठीक से कॉन्फ़िगर है।

बीन शुरू करना लागू करें

पेशेवरों:

  • इनिट-विधि को निर्दिष्ट करने की आवश्यकता नहीं है, या घटक स्कैनिंग / एनोटेशन प्रोसेसिंग चालू करें।
  • लाइब्रेरी के साथ प्रदान की जाने वाली बीन्स के लिए उपयुक्त, जहां हम इस लाइब्रेरी का इस्तेमाल करते हुए आवेदन नहीं करना चाहते हैं, जो कि बीन जीवनचक्र के साथ खुद का संबंध रखते हैं।

विपक्ष:

  • Init- विधि दृष्टिकोण से अधिक आक्रामक

JSR-250 @ PostConstruct लाइफकेली एनोटेशन का उपयोग करें

पेशेवरों:

  • घटक स्केनिंग का इस्तेमाल करते हुए बीन्स को ऑटोडेटेक्ट करने के लिए उपयोगी
  • यह स्पष्ट करता है कि आरंभीकरण के लिए एक विशिष्ट पद्धति का उपयोग किया जाना है। आशय कोड के करीब है।

विपक्ष:

  • आरंभिकता अब विन्यास में केंद्रीय रूप से निर्दिष्ट नहीं है।
  • आपको एनोटेशन प्रोसेसिंग चालू करना याद रखना चाहिए (जिसे कभी-कभी भुला दिया जा सकता है)

क्या आपने InitializingBean लागू करने की कोशिश की है? यह वास्तव में आप की तरह लगता है।

नकारात्मक पक्ष यह है कि आपकी बीन स्प्रिंग-जागरूक हो जाती है, लेकिन ज्यादातर अनुप्रयोगों में ऐसा नहीं है जो इतना बुरा नहीं है।

आप इसे करने के लिए अपने एप्लिकेशन संदर्भ में कस्टम BeanPostProcessor परिनियोजित कर सकते हैं। या यदि आप अपने सेम में एक वसंत अंतरफलक को लागू करने में कोई दिक्कत नहीं करते हैं, तो आप आरंभिक बीन इंटरफ़ेस या "init-method" निर्देश (समान लिंक) का उपयोग कर सकते हैं।

दो दृष्टिकोणों के बारे में किसी भी भ्रम को स्पष्ट करने के लिए

  1. @PostConstruct और
  2. init-method="init"

व्यक्तिगत अनुभव से, मुझे एहसास हुआ कि (1) केवल सर्विसलेट कंटेनर में काम करता है, जबकि (2) किसी भी वातावरण में काम करता है, यहां तक ​​कि डेस्कटॉप अनुप्रयोगों में भी। इसलिए, यदि आप एक स्वसंपूर्ण आवेदन में स्प्रिंग का प्रयोग करेंगे, तो आपको इसका इस्तेमाल करने के लिए (2) का उपयोग करना होगा "आरंभ करने के बाद इस पद्धति को कॉल करें"