2009-01-24 14 views
8

का उपयोग किए बिना एक गैर बीन ऑब्जेक्ट से स्प्रिंग एप्लिकेशन संदर्भ प्राप्त करना मुझे एक गैर बीन ऑब्जेक्ट से वसंत अनुप्रयोग संदर्भ प्राप्त करने की आवश्यकता है। एसओ में एक और धागे में, स्वीकृत उत्तर आवेदन संदर्भ प्राप्त करने के लिए सिंगलटन का उपयोग करने का सुझाव देता है। Getting Spring Application Contextसिंगलटन

लेकिन सिंगलटन का उपयोग कर मेरी कोड अधिक युग्मित और कम परीक्षण योग्य बनाता है, हमेशा की तरह समस्याओं कई धागे में चर्चा (जैसे What is so bad about Singletons)

सवाल है, वहाँ एक गैर सेम से आवेदन संदर्भ प्राप्त करने के लिए एक सुंदर तरीका है सिंगलटन का उपयोग किए बिना वस्तु?

उत्तर

7

हमेशा बूटस्ट्रैपिंग समस्या है। वेब अनुप्रयोगों के लिए आमतौर पर बाहरी सर्लेट फ़िल्टर होता है जो स्थिति को संभालता है।

यदि कोई वेब-ऐप नहीं है, तो किसी बाहरी प्रकार के बाहरी सिंगलटन या बूटस्ट्रैपर के आसपास कोई रास्ता नहीं है। परंतु; यहां एक सिंगलटन का उपयोग केवल उस एकल बूटस्ट्रैपर वर्ग की टेस्टेबिलिटी को प्रभावित करना चाहिए। वास्तव में केवल आपके कोड में बहुत कम स्थान होना चाहिए जिन्हें कंटेनर को किसी भी स्पष्ट तरीके से संदर्भित करने की आवश्यकता है। तो यह वास्तव में युग्मन महत्वपूर्ण रूप से वृद्धि नहीं करता है।

या रीफ्रेज करने के लिए, वास्तव में केवल कुछ ही गैर-बीन ऑब्जेक्ट्स होना चाहिए जिन्हें वसंत कंटेनर तक पहुंचने की आवश्यकता हो। यदि यह मामला नहीं है, तो आप संभवतः वसंत का उपयोग नहीं कर रहे हैं। और अधिकांश/जिनके लिए कंटेनर की आवश्यकता होती है उन्हें शायद BeanFactoryAware या ApplicationContextAware

+0

इस पर +1। सिंगललेट्स को आम तौर पर आपके आवेदन कोड से बचा जाना चाहिए। कुछ प्रकार के बूटस्ट्रैपिंग या बुनियादी ढांचे के लिए यह एक बड़ा सौदा नहीं है। बाधाएं हैं कि आपको अपने बूटस्ट्रैपर को किसी भी तरह से परीक्षण करने की आवश्यकता नहीं होगी। :) –

7

मुझे लगता है कि आपकी समस्या लगभग कुछ दिन पहले ही थी। @Component साथ

@Component 
public class AppContextManager implements ApplicationContextAware{ 
    private static ApplicationContext _appCtx; 

    @Override 
    public void setApplicationContext(ApplicationContext ctx){ 
     _appCtx = ctx; 
    } 

    public static ApplicationContext getAppContext(){ 
     return _appCtx; 
    } 
} 

एन्नोटेट ऊपर वर्ग या अपने application context xml में AppContextManager के लिए एक सेम की घोषणा: मुझे लगता है निम्नलिखित आप के लिए काम करना चाहिए:

पहले नीचे की तरह एक वर्ग AppContextManager बुलाया पैदा करते हैं।

अब आप अपने non-singletonnon-spring उदाहरण में निम्नलिखित कोड का उपयोग किसी अन्य वसंत सेम प्राप्त करने के लिए:

ApplicationContext ctx = ApplicationContextManager.getAppContext(); 
SomeSpringBean bean = ctx.getBean(SomeSpringBean.class); 

और यह आप सेम उदाहरण कहीं भी अपने कोड में देना होगा।

+1

यह काम नहीं किया। –

+1

आपने AppContextManager के लिए अपना बीन ठीक से बनाया है .. या तो आपका बीन 'घटक स्कैन बेस पैकेज' कॉन्फ़िगरेशन द्वारा परिभाषित पैकेज में होना चाहिए या इसके लिए अपने बीन घोषित करें कि आपके अनुप्रयोग संदर्भ xml में एक बीन घोषित करें। – mickeymoon

+0

@ मिकीमून उत्तर के लिए धन्यवाद, यह वास्तव में मेरी मदद करता है। –

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