2013-05-14 5 views
16

मेरे विचार में प्रबंधित बीन, मुझे डीबी से डेटा के साथ एक सूची पॉप्युलेट करने की जरूरत है। इम निर्माता से एक सीधा कॉल, कुछ इस तरह के माध्यम से यह कर रहा:जेएसएफ - @PostConstruct और कन्स्ट्रक्टर से सीधी विधि कॉल के बीच क्या अंतर है?

public MyClass(){ 
    list=populateFromDb(); 
} 

लेकिन इस विधि एक @PostConstruct एनोटेट विधि में कहा जा सकता है, जैसे:

public MyClass(){ 
} 

@PostConstruct 
populateFromDb(){...} 

के बीच अंतर है क्या इस?

+1

[@PostConstruct का उपयोग क्यों करें?] (Http://stackoverflow.com/q/3406555/1055089) – Vrushank

उत्तर

35

यदि बीन के पास अनुरोध का दायरा है, तो @PostConstruct हर बार निष्पादित किया जाएगा। प्रबंधित बीन तत्काल होने के बाद इसे बुलाया जाएगा, लेकिन बीन को दायरे में रखा जाने से पहले। इस तरह की कोई विधि कोई तर्क नहीं लेती है, शून्य लौटाती है, और फेंकने के लिए एक चेक अपवाद घोषित नहीं कर सकता है। विधि सार्वजनिक, संरक्षित, निजी, या पैकेज निजी हो सकती है। यदि विधि एक अनचेक अपवाद फेंकता है, तो जेएसएफ कार्यान्वयन को प्रबंधित बीन को सेवा में नहीं रखना चाहिए और उस प्रबंधित बीन इंस्टेंस पर कोई और menthods नहीं कहा जाएगा।

public TrainingClassForm() { 

    } 
    @PostConstruct 
    public void init() { 
     if (this.trainingListModel.getListDataModel() != null) { 
      this.trainingListModel.getAllTrainingClasses(); 
     } 

    } 


this question of stack
करने के लिए आप reffering एक प्रबंधित सेम में, @PostConstruct नियमित जावा वस्तु निर्माता के बाद कहा जाता है।
जब निर्माता को बुलाया जाता है, तो बीन अभी तक शुरू नहीं हुआ है - यानी कोई निर्भरता इंजेक्शन नहीं दी जाती है। @PostConstruct विधि में सेम पूरी तरह से आरंभ और आप निर्भरता

@PostConstruct उपयोग कर सकते हैं अनुबंध गारंटी देता है कि है कि इस विधि सेम जीवन चक्र में द्वारा सक्रिय किया जाएगा केवल एक बार होता है। ऐसा हो सकता है (हालांकि असंभव) कि एक बीन को आंतरिक काम में कंटेनर द्वारा कई बार तत्काल किया जाता है, लेकिन यह गारंटी देता है कि @PostConstruct केवल एक बार लागू किया जाएगा।
यदि आपकी कक्षा कन्स्ट्रक्टर में अपने सभी प्रारंभिक कार्य करती है, तो @PostConstruct वास्तव में अनावश्यक है।
हालांकि, यदि आपकी कक्षा में इसकी निर्भरताएं सेटर विधियों का उपयोग करके इंजेक्शन दी गई हैं, तो कक्षा का कन्स्ट्रक्टर ऑब्जेक्ट को पूरी तरह से प्रारंभ नहीं कर सकता है, और कभी-कभी कुछ प्रारंभिक विधियों को सभी सेटटर विधियों के नाम पर करने की आवश्यकता होती है, इसलिए @PostConstruct
का उपयोग केस see this और this

+0

प्लस एक तरफ से एक। यदि मैं डेटाबेस से प्राप्त मूल्य के साथ इनपुटटेक्स्ट फ़ील्ड प्रारंभ करना चाहता हूं, तो मैं पोस्टकॉन्स्ट्रक्ट की मदद से ऐसा करने में सक्षम हूं, लेकिन कन्स्ट्रक्टर के अंदर ऐसा करने का प्रयास करते समय विफल रहता है। मेरे पास PostContruct के उपयोग के बिना प्रारंभ करने की आवश्यकता है। यदि आपके पास समय है, तो क्या आप इसका उत्तर भी दे सकते हैं: http://stackoverflow.com/questions/27540573/how-to-initialize-inputtextfield-with-a-value-from-database-on-runtime-without-t –

संबंधित मुद्दे