2010-11-15 8 views
14

Session.getDefaultInstance(props, authenticator) और getInstance(props, authenticator) के बीच क्या अंतर है? आम तौर पर, आप एक दूसरे के ऊपर कब चुनेंगे?सत्र कक्षा में getDefaultInstance() और getInstance() के बीच क्या अंतर है?

मैंने getDefaultInstance(props, authenticator) पर जावा दस्तावेज़ भी पढ़ा, लेकिन फिर भी अंतर स्पष्ट रूप से/स्पष्ट रूप से नहीं कर सका।

आशा है कि विशेषज्ञ इस बेहतर समझने में मेरी सहायता कर सकते हैं।

अद्यतन: इस सवाल से पूछने के लिए वास्तविक कारण यह है कि: हमने अपने वेब-आधारित एप्लिकेशन के भीतर कुछ स्थानों पर Session.getDefaultInstance() विधि का उपयोग किया है। कभी-कभी, यह java.lang.SecurityException: Access to default session denied फेंकता है, त्वरित googling पर, यह इसके बजाय Session.getInstance() विधि का उपयोग करने का सुझाव दिया। इसलिए, जब कोई दूसरे पर एक का चयन करेगा?

+1

http://download.oracle.com/javaee/6/api/javax/mail/Session.html#getInstance(java.util.Properties) यह दस्तावेज़ आप अंतर –

+0

समझने @ org.life मदद कर सकता है .java: मुझे कोई अंतर नहीं मिला? क्या आप मुझे कुछ विशिष्ट वाक्य/पैरा में इंगित कर सकते हैं? – Gnanam

+0

'getInstance()': एक नया सत्र वस्तु प्राप्त करें। , 'getDefaultInstance() ': डिफ़ॉल्ट सत्र ऑब्जेक्ट प्राप्त करें। यदि कोई डिफ़ॉल्ट अभी तक सेटअप नहीं किया गया है, तो एक नया सत्र ऑब्जेक्ट डिफ़ॉल्ट रूप से बनाया और स्थापित किया गया है। –

उत्तर

16

आप दस्तावेज़ पढ़ें, तो आप उस

getDefaultInstance डिफ़ॉल्ट सत्र वस्तु प्राप्त देखेंगे। यदि कोई डिफ़ॉल्ट अभी तक सेटअप नहीं किया गया है, तो एक नया सत्र ऑब्जेक्ट डिफ़ॉल्ट रूप से बनाया और स्थापित किया गया है।

इसलिए, यदि पहले से ही मौजूद नहीं है, यह getInstance फोन()

getInstance एक नया सत्र वस्तु प्राप्त करें।

तो, कोई नया सत्र ऑब्जेक्ट बनाया गया है, भले ही कोई पहले से मौजूद है या नहीं।

+0

इस प्रश्न पूछने का वास्तविक कारण यहां बताया गया है: हमने अपने वेब-आधारित एप्लिकेशन के भीतर कुछ स्थानों में 'सत्र.getDefaultInstance() 'विधि का उपयोग किया है। कभी-कभी, यह 'java.lang.SecurityException: डिफ़ॉल्ट सत्र तक पहुंच अस्वीकार कर देता है', त्वरित googling पर, यह बजाय 'सत्र.getInstance() 'विधि का उपयोग करने का सुझाव दिया। और यही कारण है कि मैंने यहां पूछा है कि जब कोई दूसरे पर एक चुनता है? – Gnanam

+0

डिफ़ॉल्ट कारणों का उपयोग करने के लिए मैं केवल एक कारण देख सकता हूं, यह सत्र की अनावश्यक रूप से कई उदाहरण बनाने की आवश्यकता को रोकता है, लेकिन इसके अलावा कोई अंतर नहीं है। यदि आपको अनुमतियों में समस्या हो रही है, तो केवल getInstance() का उपयोग करें, इससे आपको कोई समस्या नहीं होनी चाहिए। हालांकि, आपके आवेदन को वैश्विक स्तर पर इसे स्टोर करना चाहिए, हालांकि हर बार जब आपको इसकी आवश्यकता होती है तो एक नया उदाहरण बनाने के बजाय। – Codemwnci

+0

प्रति दस्तावेज़, 'getDefaultInstance(): डिफ़ॉल्ट सत्र ऑब्जेक्ट प्राप्त करें। यदि कोई डिफ़ॉल्ट अभी तक सेटअप नहीं किया गया है, तो एक नया सत्र ऑब्जेक्ट बनाया गया है और डिफ़ॉल्ट के रूप में स्थापित किया गया है। ', बाद में कॉल' getDefaultInstance() 'को पहले से बनाए गए सत्र का उपयोग नहीं करेगा? – Gnanam

2

कारण यह त्रुटि javax.mail.Session.java में getDefaultInstance विधि में उठाई गई है। इस स्रोत कोड के अनुसार, यह त्रुटि तब होती है जब डिफ़ॉल्ट सत्र ऑब्जेक्ट पहले ही प्रारंभ हो चुका है, लेकिन प्रमाणीकरणकर्ता उदाहरण नवीनीकृत या बदला गया है, या डिफ़ॉल्ट सत्र ऑब्जेक्ट का क्लास लोडर तर्क प्रमाणीकरणकर्ता से अलग है। हो सकता है कि जावा मेल के डिफ़ॉल्ट सत्र उदाहरण का उपयोग कर जावा स्रोत कोड को पुन: संकलित और पुनः लोड किया गया हो, या डुप्लिकेट जावामेल क्लास पुस्तकालयों को पर्यावरण के कक्षा में शामिल किया गया हो। यह उचित समाधान

javax.mail.Session.java file 
    public static synchronized Session getDefaultInstance(Properties props, 
             Authenticator authenticator) { 
     if (defaultSession == null) 
      defaultSession = new Session(props, authenticator); 
     else { 
      // have to check whether caller is allowed to see default session 
      if (defaultSession.authenticator == authenticator) 
       ;  // either same object or both null, either way OK 
      else if (defaultSession.authenticator != null && 
        authenticator != null && 
        defaultSession.authenticator.getClass().getClassLoader() == 
         authenticator.getClass().getClassLoader()) 
       ;  // both objects came from the same class loader, OK 
      else 
       // anything else is not allowed 
       throw new SecurityException("Access to default session denied"); 
     } 

     return defaultSession; 
    } 
2

मेरे लिए देता है, यह getInstance()getDefaultInstance() के बजाय का उपयोग करने के बहुत महत्वपूर्ण था।

क्योंकि मेल सत्र गुण परिवर्तित होने के बाद, मेल सत्र अभी भी पुराने गुणों को संग्रहीत कर रहा था।

तो getDefaultInstance() - यह सिंगलटन जैसा दिखता है।

डॉक्स के रूप में कहा:

भी ध्यान रखें कि गुण वस्तु केवल पहली बार प्रयोग किया जाता है इस विधि, कहा जाता है जब एक नया सत्र वस्तु बन जाता है। बाद की कॉल सत्र ऑब्जेक्ट को वापस लाती है जो पहली कॉल द्वारा बनाई गई थी, और पास की गई प्रॉपर्टी ऑब्जेक्ट को अनदेखा कर देती है। जब भी विधि कहा जाता है, तो नया सत्र ऑब्जेक्ट प्राप्त करने के लिए getInstance विधि का उपयोग करें।

+0

जानकारी का यह मुख्य भाग getDefaultInstance (गुण, प्रमाणीकरणकर्ता) के लिए प्रलेखन में है और इसमें getDefaultInstance (गुण) के लिए नहीं है। – ARX

1

पूछे जाने वाले प्रश्न का कहना है: https://javaee.github.io/javamail/FAQ#getdefaultinstance

प्रश्न: मैं Session.getDefaultInstance का उपयोग करें और कब करना चाहिए जब मैं Session.getInstance का उपयोग चाहिए?

ए: लगभग सभी कोड Session.getInstance का उपयोग करना चाहिए। Session.getDefaultInstance विधि पारित गुणों का उपयोग करते हुए, पहले समय पर एक नया सत्र बनाता है। बाद के कॉल उस मूल सत्र को वापस कर देंगे और पास किसी भी प्रॉपर्टी को अनदेखा कर देंगे। यदि आप अलग-अलग गुणों के साथ अलग-अलग सत्र बनाना चाहते हैं, तो सत्र.getDefaultInstance ऐसा नहीं करेगा। यदि एक ही JVM में कुछ अन्य कोड (उदा।, उसी ऐप सर्वर में) पहले से ही ने अपनी संपत्तियों के साथ डिफ़ॉल्ट सत्र बनाया है, तो आप अपने सत्र का उपयोग करके समाप्त कर सकते हैं और आपकी गुणों को अनदेखा कर दिया जाएगा। यह अक्सर बताता है कि आपकी संपत्ति सेटिंग्स को क्यों अनदेखा किया जा रहा है। इस समस्या से बचने के लिए हमेशा Session.getInstance का उपयोग करें।

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