2012-09-06 15 views
6

मुझे कक्षाओं के लिए एक वसंत वेब संदर्भ (किसी भी दायरे में) में नए सेम जोड़ने की आवश्यकता है जो संकलन समय पर कक्षापथ में परिभाषित नहीं किया जा सकता है।स्प्रिंग वेब संदर्भ में गतिशील बीन्स जोड़ना

उदाहरण के लिए, मैं कुछ कक्षाओं को गतिशील रूप से बना सकता हूं और फिर इस कक्षा के लिए सिंगलटन या सत्र बीन पंजीकृत कर सकता हूं।

मैं BeanFactoryPostProcessor के बारे में थोड़ा है, लेकिन यकीन है कि अगर यह एक वेब संदर्भ पर काम करेंगे नहीं पढ़ा है, और अगर मैं सही ढंग से समझ यह केवल वास्तव में सेम उदाहरणों लोड करने से पहले और न उसके बाद काम करते हैं, या मैं गलत हूँ होगा?

मैं एनोटेशन कॉनफिग वेब ऐप्लिकेशंस कॉन्टेक्स्ट में ऐसा करने के तरीके के बारे में जानकारी नहीं पा रहा हूं, और कम से कम मेरे परीक्षण में सभी बीन्स जो मैं द्विपक्षीय रूप से बनाते हैं उन्हें अन्य उदाहरणों में इंजेक्शन नहीं दिया जाता है, और यहां तक ​​कि अगर वे केवल मुझे देख रहे थे सिंगलटन बीन्स को पंजीकृत करने की विधि लेकिन अन्य स्कॉप्स के लिए नहीं:

ctx.getBeanFactory().registerSingleton("dummy", dummy); 

पीडी

मैं इस सवाल पाया: Dynamic creation of beans in Spring लेकिन जब मैं इस तरह वेब संदर्भ के लिए किसी भी सेम, सेम परिभाषा या सेम परिभाषा बिल्डर को जोड़ने का प्रयास सेम लोड नहीं हो जाता है:

AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
ctx.setServletContext(servletContext); 
ctx.refresh(); 
// 
log.trace("Registering first test bean"); 
Test test = new Test(); 
test.setDummy("x1"); 
ctx.getBeanFactory().registerSingleton("myTestBean1", test);   

log.trace("Registering second test bean"); 
BeanDefinition testDef = new RootBeanDefinition(Test.class);   
testDef.setScope(BeanDefinition.SCOPE_SINGLETON);   
ctx.getBeanFactory().registerSingleton("myTestBean2", testDef); 

Test dummy1 = (Test)ctx.getBean("myTestBean1"); 
Object dummy2 = ctx.getBean("myTestBean2"); 

log.trace("beans: 1: {}; 2: {}", dummy1, dummy2); //<--this works, but... 
ctx.refresh(); 

ctx.register(MyConfig.class); //configuring other beans 

... जब मैं (एक और गतिशील घटक यह भी भी हो सकता है) एक और सेम MyConfig.class अंदर कॉन्फ़िगर किया गया या @Component साथ एनोटेट से ऐसा करते हैं:

@Autowire Test myTestBean1; 
//Or this: 
Object a = this.ctx.getBean("myTestBean1"); //Or myTestBean2 

यह एक NoSuchBeanDefinitionException

012 फेंकता

कृपया मेरी मदद करें !! मैं बहुत कुछ देख रहा था और किसी भी उपयोगी जानकारी को मिला, या शायद मेरे पास है लेकिन मैं इस तरह के कम समय में वेब में जो कुछ भी पाता हूं उसका परीक्षण नहीं कर सकता हूं और बसंत दस्तावेज सामान्य मामलों और एक्सएमएल कॉन्फ़िगरेशन के लिए बहुत अच्छा लगता है, नहीं इस पागल चीजों के लिए मैं करने की कोशिश कर रहा हूं और प्रोग्रामिक रूप से कॉन्फ़िगरेशन के लिए नहीं।

+0

मुझे आश्चर्य है अगर जावा कोड में स्पष्ट रूप से निपटने वस्तु lifecycles बातें सरल –

उत्तर

2

आप जो भी कर रहे हैं उसे पूरा नहीं किया जा सकता है, क्षमा करें। ऑटोवायरिंग तब होती है जब एक बीन शुरू में बनाया जाता है। आपके मामले में, आप फैक्ट्री में इसे जोड़ने से पहले एक बीन तार करने की उम्मीद करते हैं, जो निश्चित रूप से काम नहीं करेगा - वसंत समय-यात्रा नहीं करता है।

मुझे लगता है कि आप फैक्ट्री पैटर्न के बाद क्या सोचते हैं। वसंत में, आप FactoryBean को लागू करके बनाए गए कारखाने के लिए एक बीन की तत्कालता को रोक सकते हैं। यहां अधिक पढ़ें:

+0

धन्यवाद नहीं होगा लेकिन उदाहरण में मैं में यह Autowiring से पहले सेम बनाने एक और बीन, मैंने सवाल को और स्पष्ट करने के लिए संपादित किया, हालांकि यह दिलचस्प लग रहा है ... अगर मुझे किसी अन्य दृष्टिकोण की आवश्यकता है तो इसे देखेंगे –

+0

@Lando अपने उदाहरण में, आप 'ctx.refresh() 'को कॉल करके शुरू करते हैं लाइन दो, जो पूरे बीन कारखाने का निर्माण करता है और सभी autowirin प्रक्रिया करता है जी एस। ऐसा कुछ भी करने से पहले होता है। भले ही, रनटाइम पर मैन्युअल रूप से बीन्स डालने का तरीका यह नहीं है कि वसंत का काम कैसे किया जाता है। मुझे यकीन है कि आप इसे किसी भी तरह काम करने के लिए प्राप्त कर सकते हैं, लेकिन यह सुंदर नहीं होने वाला है। यदि आपको बीन निर्माण में देरी/स्थगित करने की आवश्यकता है तो आपको स्कॉप्स और/या कारखानों और इंटरफेस के साथ काम करना चाहिए। – pap

+0

अगर मैं पहले रीफ्रेश नहीं करता हूं, तो मुझे एक IllegalStateException मिलता है, मैं कोड जांचता हूं और यह मान्य करता है कि नए सिंगलेट्स को पंजीकृत करते समय फैक्ट्री शून्य नहीं है। कारखानों के साथ समस्या यह है कि मुझे अभी भी परिभाषित बीन का नाम होना चाहिए ताकि स्प्रिंग प्रतिनिधि कारखाने में सृजन कर सके। मैं विचारों से बाहर हो रहा हूं :( –

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