2010-12-27 22 views
41

प्लग-इन आर्किटेक्चर के कारण प्रोग्रामेटिक रूप से बीन जोड़ें, मैं अपने वेबैप में प्रोग्रामिंग रूप से एक बीन जोड़ने की कोशिश कर रहा हूं। मेरे पास @Component एनोटेशन के माध्यम से एक स्प्रिंग बीन बनाया गया है, और मैं ApplicationContextAware इंटरफ़ेस को कार्यान्वित कर रहा हूं।स्प्रिंग वेब ऐप संदर्भ

मेरे ओवरराइड समारोह इस तरह दिखता है:

@Override 
public void setApplicationContext(ApplicationContext applicationContext) 
     throws BeansException { 

    // this fails 
    this.applicationContext = (GenericWebApplicationContext) applicationContext; 
} 

असल में, मैं setApplicationContext को दिया applicationContext वस्तु के लिए एक सेम जोड़ने का तरीका समझ नहीं सकता। क्या कोई मुझे बता सकता है कि मैं इस बारे में गलत तरीके से कैसे जा रहा हूं?

ठीक है, यह है कि क्या मैं समाधान के रूप में के साथ समाप्त हो गया है:

@Override 
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry bdr) 
     throws BeansException { 
    BeanDefinition definition = new RootBeanDefinition(
      <My Class>.class); 

    bdr.registerBeanDefinition("<my id>", definition); 
} 

उत्तर

34

स्प्रिंग 3.0 में आप अपने सेम BeanDefinitionRegistryPostProcessor को लागू करने और BeanDefinitionRegistry के माध्यम से नई सेम जोड़ने कर सकते हैं।

वसंत के पिछले संस्करणों में आप BeanFactoryPostProcessor में एक ही चीज़ कर सकते हैं (हालांकि आपको BeanFactoryBeanDefinitionRegistry पर डालना होगा, जो असफल हो सकता है)।

+7

धन्यवाद। मुझे लगता है कि सबसे कठिन हिस्सा यह जानना है कि क्या देखना है। – user146714

+1

कृपया ध्यान दें कि [जावाडॉक] के अनुसार (http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/beans/factory/config/BeanPostProcessor.html): 'एक बीनफैक्टरीपोस्टप्रोसेसर बीन परिभाषाओं के साथ बातचीत और संशोधित कर सकता है, लेकिन कभी भी बीन उदाहरण नहीं। ऐसा करने से समय से पहले बीन तत्कालता हो सकती है, कंटेनर का उल्लंघन हो सकता है और अनपेक्षित दुष्प्रभाव पैदा हो सकते हैं। यदि बीन इंस्टेंस इंटरैक्शन की आवश्यकता है, तो इसके बजाय बीनपोस्टप्रोसेसर को लागू करने पर विचार करें। ' – dgiffone

+0

' बीनडिफिनिशन रजिस्ट्रीपोस्टप्रोसेसर 'के साथ क्या करना है? मान लीजिए मैंने इस वर्ग को लिखा था। आगे क्या? इसे कैसे सक्रिय करें? – Dims

8

के माध्यम से जाएं GenericWebApplicationContext टाइप करने के लिए आपको इसकी आवश्यकता क्यों है?
मुझे लगता है कि आप शायद किसी भी एप्लिकेशन कॉन्टेक्स्ट प्रकार के साथ काम कर सकते हैं।

आमतौर पर आप एक init विधि (अलावा अपने सेटर विधि करने के लिए) का प्रयोग करेंगे:

@PostConstruct 
public void init(){ 
    AutowireCapableBeanFactory bf = this.applicationContext 
     .getAutowireCapableBeanFactory(); 
    // wire stuff here 
} 

और तुम तार होता सेम का उपयोग किया या तो

AutowireCapableBeanFactory.autowire(Class, int mode, boolean dependencyInject)

या

AutowireCapableBeanFactory.initializeBean(Object existingbean, String beanName)

28

यहां एक साधारण कोड है:

ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); 
beanFactory.registerSingleton(bean.getClass().getCanonicalName(), bean); 
संबंधित मुद्दे