जब मेरा 'सामान्य' बीन बन जाता है तो मुझे गतिशील रूप से बनाई गई बीन जोड़ने की आवश्यकता होती है। मैंने अब तक यह कोशिश की:

//generate a health bean dynamically, and register it
@PostConstruct
public void init(){
    solrhealth = new SolrHealthIndicator(solr);
    //context.??
}

मैं प्रोग्राम के रूप में एक SolrHealthIndicatior बीन का निर्माण करता हूं, क्योंकि मैं स्प्रिंग सोलर डेटा का उपयोग नहीं कर रहा हूं। अब मैं इसे पंजीकृत कराना चाहता हूं ताकि यह /स्वास्थ्य में दिखाई दे।

मेरे पास मेरा संदर्भ वायर्ड है, लेकिन वहां नव निर्मित बीन को पंजीकृत करने का तरीका नहीं मिल रहा है ...

1
Persimmonium 21 अगस्त 2017, 21:09

3 जवाब

सबसे बढ़िया उत्तर

आप @Configuration वर्ग के भीतर @Bean एनोटेशन का उपयोग करके अपने बीन को प्रोग्रामिक रूप से परिभाषित करने में सक्षम होना चाहिए।

@Bean
public SolrHealthIndicator solrHealthIndicatior() {
    //you can construct the object however you want
    return new SolrHealthIndicator();
}

फिर आप इसे किसी भी अन्य बीन (@Autowired कंस्ट्रक्टर, फील्ड, सेटर इंजेक्शन, आदि) की तरह इंजेक्ट कर सकते हैं, यदि एक ही प्रकार के कई बीन्स हैं तो आप उनके बीच अंतर करने के लिए @Qualifier का उपयोग कर सकते हैं।

1
Magnus 22 अगस्त 2017, 07:06

आपको @Lookup एनोटेशन का उपयोग करने की आवश्यकता है।

@Component
public class SolrHealthIndicator {

    public SolrHealthIndicator(Solr solr) {

    }
}


public class BeanInQuestion {

    @PostConstruct
    public void init() {
        solrHealthIndicator = getHealthIndicatorBean();
    }

    @Lookup
    public SolrHealthIndicator getHealthIndicatorBean() {
        //Spring creates a runtime implementation for this method
        return null;
    }

}
0
yaswanth 21 अगस्त 2017, 21:18

आप अपने @PostConstruct वाले वर्ग को BeanDefinitionRegistryPostProcessor. तब आप अपने बीन्स को प्रोग्रामेटिक रूप से पंजीकृत करने में सक्षम होंगे:

@Bean
public class MyBean implements BeanDefinitionRegistryPostProcessor {

    private BeanDefinitionRegistry registry;

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        this.registry = registry;
    }

    @PostConstruct
    public void init(){
        registry.registerBeanDefinition("solrHealthIndicator", new SolrHealthIndicator(solr));
    }
}
0
Ben M 22 अगस्त 2017, 01:22