स्प्रिंग नियंत्रक में प्रवेश विधि (एनोटेशन संस्करण)


105

मैं एक नियंत्रक को नए एनोटेशन संस्करण में परिवर्तित कर रहा हूं। पुराने संस्करण में मैंने स्प्रिंगमेट-सर्वलेट.एक्सएमएल में इनिट विधि को निर्दिष्ट करने के लिए उपयोग किया था:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

मैं एनोटेशन संस्करण का उपयोग करके init विधि कैसे निर्दिष्ट कर सकता हूं?


यह भी देखें stackoverflow.com/questions/1088550
skaffman

जवाबों:


238

आप उपयोग कर सकते हैं

@PostConstruct
public void init() {
   // ...
}

1
आप सही हैं, इसका "कॉमन एनोटेशन 1.0", Java1.7 भी काम करेगा।
ग्रिम

यदि आपको PostConstruct क्षण में SecurityContextHolder से उपयोगकर्ता का उपयोग करने की आवश्यकता है, तो इसे प्रारंभ नहीं किया गया है। इसे एक स्टेटलेस विधि की तरह इस्तेमाल करने की आवश्यकता है। (getUser () ... {वापसी सुरक्षा ... उपयोगकर्ता);}
जोआओ पोलो

सार्वजनिक या निजी
anshulkatta

20

वैकल्पिक रूप से आप अपनी कक्षा InitializingBeanको कॉलबैक फ़ंक्शन ( afterPropertiesSet()) प्रदान करने के लिए इंटरफ़ेस लागू कर सकते हैं, जो कि सेम के निर्माण के समय ApplicationContext आह्वान करेगा।


4

वसंत में आरंभीकरण प्रक्रिया को बाधित करने के कई तरीके हैं। यदि आपको सभी बीन्स को शुरू करना है और उन्हें ऑटो करना / इंजेक्ट करना है तो कम से कम दो तरीके हैं जो मुझे पता है कि यह सुनिश्चित करेगा। मेरे पास केवल दूसरा टेस्ट है, लेकिन मैं मानता हूं कि दोनों एक ही काम करते हैं।

यदि आप @ बीन का उपयोग कर रहे हैं तो आप 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 अंतिम रूप से चलता है।


-2
public class InitHelloWorld implements BeanPostProcessor {

   public Object postProcessBeforeInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("BeforeInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

   public Object postProcessAfterInitialization(Object bean,
             String beanName) throws BeansException {
       System.out.println("AfterInitialization : " + beanName);
       return bean;  // you can return any other object as well
   }

}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.