जवाबों:
व्यावहारिक रूप से मुझे नहीं लगता कि इसमें कोई अंतर है लेकिन उनके काम करने के तरीके में प्राथमिकताएं हैं। @PostConstruct
, init-method
बीनपोस्टप्रोसेसर हैं।
@PostConstruct
एक जेएसआर -50 एनोटेशन है, जबकि init-method
स्प्रिंग का एक प्रारंभिक विधि होने का तरीका है।@PostConstruct
विधि है, तो शुरुआती तरीकों को कॉल करने से पहले इसे पहले कहा जाएगा।afterPropertiesSet
, तो पहले @PostConstruct
कॉल किया जाता है, फिर afterPropertiesSet
और फिर init-method
।अधिक जानकारी के लिए आप स्प्रिंग के संदर्भ प्रलेखन की जांच कर सकते हैं ।
JSR 250 स्पेक्स से पहले, xml में init-method का उपयोग करना पसंद किया गया था, क्योंकि यह किसी भी स्प्रिंग विशिष्ट कक्षाओं / एनोटेशन से java क्लासेस (बीन्स) को डिकम्पोज करता है। यदि आप एक लाइब्रेरी का निर्माण कर रहे हैं, जिसे स्प्रिंग इंफ्रास्ट्रक्चर बीन्स पर निर्भर होने की आवश्यकता नहीं है तब init-method का उपयोग पसंद किया गया था। निर्माण की विधि u को वह विधि निर्दिष्ट कर सकती है जिसे आरंभीकरण विधि के रूप में कहा जाना चाहिए।
अब जावा ईई में जेएसआर 250 चश्मा और इन एनोटेशन के वसंत समर्थन की शुरूआत के साथ, वसंत ढांचे पर निर्भरता कुछ हद तक कम हो गई है।
लेकिन मुझे यह स्वीकार करना होगा कि इन चीजों के अलावा कोड की पठनीयता में वृद्धि होती है। इसलिए, दोनों दृष्टिकोणों के पक्ष और विपक्ष हैं।
कोई वास्तविक अंतर नहीं है। यह नीचे है कि आप अपने सिस्टम को कैसे कॉन्फ़िगर करना पसंद करते हैं, और यह व्यक्तिगत पसंद की बात है। अपने आप से, मैं @PostConstruct
अपने कोड के लिए एनोटेशन का उपयोग करना पसंद करता हूं (जैसा कि विधि कहा जाता है के बाद बीन केवल सही तरीके से कॉन्फ़िगर किया गया है) और मैं उपयोग करता हूं init-method
जब गैर-वसंत-जागरूक पुस्तकालयों से बीन्स को इंस्टेंटिंग करता है (वहां एनोटेशन लागू नहीं कर सकता है, निश्चित रूप से!) लेकिन मैं पूरी तरह से इसे एक या दूसरे तरीके से करने के इच्छुक लोगों को समझ सकता हूं।
@ पॉस्टकंस्ट्रक्ट वसंत का हिस्सा नहीं है। यह javax पैकेज का हिस्सा है। दोनों एक ही हैं। init-method का उपयोग करके हमें xml फ़ाइल में जोड़ा जाना चाहिए। यदि आप xp में @postconstruct को जोड़ने का उपयोग करते हैं, तो आवश्यक नहीं है। नीचे दिए गए लेख को देखें।
जैसा कि आप बीन क्रिएशन लाइफ-साइकल कॉलबैक के नीचे आरेख में देख सकते हैं ।
यह 3 चरण बीन क्रिएशन लाइफ-साइकल कॉलबैक में होता है:
@PostConstruct
किया जाता है कि कहा जाएगा।InitializingBean
लागू afterPropertiesSet()
किया जाता है , तो बुलाया जाएगा।init-method
या @Bean(initmethod="..")
फिर यह init विधि कहती है।यह आरेख प्रो स्प्रिंग 5: एन-डेप्थ गाइड टू द स्प्रिंग फ्रेमवर्क और इसके टूल्स से है
के बीच अंतर हो सकता है@PostConstruct
और init-method
क्योंकि सेम इनिशियलाइज़ेशन ( विधि) @PostConstruct
के postProcessAfterInitialization
चरण में संभाला जाता AbstractAutowireCapableBeanFactory.initializeBean()
है CommonAnnotationBeanPostProcessor
, जबकि चरण init
के पूरा होने के बाद विधि को बुलाया जाता है postProcessBeforeInitialization
(और, इस मामले के लिए, postProcessAfterInitialization
चरण की शुरुआत से पहले )।
EDIT : तो, अनुक्रम है: 1) postProcessBeforeInitialization
चरण, 2) init
विधि को बुलाया जाता है, 3) postProcessAfterInitialization
चरण, जिसे @PostConstruct
विधि कहा जाता है
(एक साइड नोट के रूप में, स्वीकृत उत्तर से एक बयान
@PostConstruct, init-पद्धति बीनपोस्टप्रोसेसर है
बिलकुल सही नहीं है: @PostConstruct
एक के द्वारा नियंत्रित किया जाता है BeanPostProcessor
, init
विधि नहीं है।)
वहाँ हो जाएगा अंतर अगर कुछ (संभावित कस्टम) BeanPostProcessor
, जिसके साथ कॉन्फ़िगर किया गया है ( Ordered.getOrder()
) के बाद निष्पादित किया जाना है CommonAnnotationBeanPostProcessor
, कुछ अपने में गंभीर कर रहा है postProcessBeforeInitialization
विधि।
वहाँ नहीं है के डिफ़ॉल्ट स्प्रिंग विन्यास के साथ कोई फर्क BeanPostProcessors
क्योंकि सभी BeanPostProcessors
जिसके बाद निष्पादित करने के लिए कॉन्फ़िगर किया गया है CommonAnnotationBeanPostProcessor
, में कुछ भी नहीं करते postProcessBeforeInitialization
विधि।
निष्कर्ष में, स्वीकृत जवाब और समान सही हैं ... 99% मामलों में, और यह पोस्ट सिर्फ एक अवधारणा "श्रद्धांजलि विवरण में है" के लिए श्रद्धांजलि देने के लिए है
यहाँ पूर्ण कोड: https://github.com/wkaczurba/so8519187 ( वसंत-बूट )
एनोटेशन का उपयोग करना:
@Slf4j
@Component
public class MyComponent implements InitializingBean {
@Value("${mycomponent.value:Magic}")
public String value;
public MyComponent() {
log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
}
@PostConstruct
public void postConstruct() {
log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
}
@Override // init-method; overrides InitializingBean.afterPropertiesSet()
public void afterPropertiesSet() {
log.info("MyComponent in afterPropertiesSet: [{}]", value); // (2) displays: Magic
}
@PreDestroy
public void preDestroy() {
log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
}
}
हमें हो जाता है:
ताज़ा करना org.springframework.context ...
कंस्ट्रक्टर में MyComponent: [null]
MyCponent in postConstruct: [Magic]
MyComponent in afterPropertiesSet: [मैजिक]
...
स्टार्टअप पर JMX एक्सपोज़र के लिए बीन्स रजिस्टर
करना 0.561 सेकंड में शुरू किया गया डेमोफ्लेक्शंस (JVM 1.011 पर चल रहा है)
समापन org.springframework.context । बंद पर JMX उजागर सेम Unregistering
...
PreDestroy में MyComponent: [जादू]