जवाबों:
व्यावहारिक रूप से मुझे नहीं लगता कि इसमें कोई अंतर है लेकिन उनके काम करने के तरीके में प्राथमिकताएं हैं। @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: [जादू]