वसंत में आरंभीकरण प्रक्रिया को बाधित करने के कई तरीके हैं। यदि आपको सभी बीन्स को शुरू करना है और उन्हें ऑटो करना / इंजेक्ट करना है तो कम से कम दो तरीके हैं जो मुझे पता है कि यह सुनिश्चित करेगा। मेरे पास केवल दूसरा टेस्ट है, लेकिन मैं मानता हूं कि दोनों एक ही काम करते हैं।
यदि आप @ बीन का उपयोग कर रहे हैं तो आप initMethod द्वारा संदर्भ दे सकते हैं, इस तरह।
@Configuration
public class BeanConfiguration {
@Bean(initMethod="init")
public BeanA beanA() {
return new BeanA();
}
}
public class BeanA {
// method to be initialized after context is ready
public void init() {
}
}
यदि आप @Component का उपयोग कर रहे हैं तो आप इस तरह @EventListener के साथ एनोटेट कर सकते हैं।
@Component
public class BeanB {
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
}
}
मेरे मामले में मेरे पास एक विरासत प्रणाली है जहां मैं अब IoC / DI का उपयोग कर रहा हूं, जहां स्प्रिंग बूट चुना हुआ ढांचा है। पुरानी प्रणाली तालिका में कई परिपत्र निर्भरताएं लाती है और इसलिए मुझे सेटर-निर्भरता का बहुत उपयोग करना चाहिए। इससे मुझे कुछ सिरदर्द हुआ क्योंकि मैं @PostConstruct पर भरोसा नहीं कर सकता था क्योंकि सेटर द्वारा ऑटोवायरिंग / इंजेक्शन अभी तक नहीं किया गया था। ऑर्डर कंस्ट्रक्टर है, @PostConstruct तब ऑटॉइर सेटल होता है। मैंने इसे @EventListener एनोटेशन के साथ हल किया, जो पिछले सभी बीन्स के लिए "समान" समय पर चलता है। उदाहरण के रूप में प्रारंभिक बीन के कार्यान्वयन को दर्शाता है।
मेरे पास एक दूसरे पर निर्भरता के साथ दो कक्षाएं (@Component) हैं। इस उदाहरण के उद्देश्य से कक्षाएं केवल एक को प्रदर्शित करने के उद्देश्य से समान दिखती हैं।
@Component
public class BeanA implements InitializingBean {
private BeanB beanB;
public BeanA() {
log.debug("Created...");
}
@PostConstruct
private void postConstruct() {
log.debug("@PostConstruct");
}
@Autowired
public void setBeanB(BeanB beanB) {
log.debug("@Autowired beanB");
this.beanB = beanB;
}
@Override
public void afterPropertiesSet() throws Exception {
log.debug("afterPropertiesSet()");
}
@EventListener
public void onApplicationEvent(ContextRefreshedEvent event) {
log.debug("@EventListener");
}
}
यह लॉग आउटपुट है जब कंटेनर शुरू होने पर कॉल का क्रम दिखाया जाता है।
2018-11-30 18:29:30.504 DEBUG 3624 --- [ main] com.example.demo.BeanA : Created...
2018-11-30 18:29:30.509 DEBUG 3624 --- [ main] com.example.demo.BeanB : Created...
2018-11-30 18:29:30.517 DEBUG 3624 --- [ main] com.example.demo.BeanB : @Autowired beanA
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanB : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanB : afterPropertiesSet()
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : @Autowired beanB
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : @PostConstruct
2018-11-30 18:29:30.518 DEBUG 3624 --- [ main] com.example.demo.BeanA : afterPropertiesSet()
2018-11-30 18:29:30.607 DEBUG 3624 --- [ main] com.example.demo.BeanA : @EventListener
2018-11-30 18:29:30.607 DEBUG 3624 --- [ main] com.example.demo.BeanB : @EventListener
जैसा कि आप देख सकते हैं कि सब कुछ तैयार होने और कॉन्फ़िगर होने के बाद @EventListener अंतिम रूप से चलता है।