दिलचस्प पोस्ट
फ़ंक्शन के नाम से एक स्ट्रिंग से एक मॉड्यूल के फ़ंक्शन को कॉल करना अजीब परिणाम जब सूची से आइटम को हटाने से Kotlin और Immutable संग्रह? पंक्ति_एनम्बर () के साथ एसक्यूएल अद्यतन एचडीएफ 5 प्रारूप में कैफ़ मल्टी लेबल डेटा कैसे खिलाएगा? क्या एचटीएमएल 5 स्थानीय अवस्था अतुल्यकालिक है? pybrain: एक नेटवर्क कैसे मुद्रित करें (नोड्स और वज़न) जावा सशर्त संकलन: कैसे कोड विखंडू संकलित होने से रोकने के लिए? ग्रहण / एंड्रॉइड: "डेवलपर रनिंग डेवलपर 'एंड्रॉइड प्री कम्पाइलर' परियोजना पर …" एडीबी एंड्रॉइड डिवाइस अनधिकृत मैं NSDictionary को एनएसडीएटा में कैसे परिवर्तित कर सकता हूं और इसके विपरीत? sudo in php exec () टाइपस्क्रिप्ट में jQuery के प्लगइन का उपयोग करना समान मूल्य के लिए एक सरणी के सभी सदस्यों को कैसे प्रारंभ करें? स्कला में अंडरस्कोर के सभी उपयोग क्या हैं?

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

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

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

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

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

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

<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) का उपयोग करना होगा "आरंभ करने के बाद इस पद्धति को कॉल करें"