2012-03-25 6 views
46

बीनपोस्टप्रोसेसर इंटरफ़ेस को कार्यान्वित करने और या तो वसंत में XML कॉन्फ़िगरेशन फ़ाइल में init/नष्ट विधि विशेषताओं का उपयोग करने या InitializingBean/DisposableBean इंटरफ़ेस को कार्यान्वित करने के बीच क्या अंतर है?वसंत में बीनपोस्टप्रोसेसर और init/नष्ट विधि के बीच क्या अंतर है?

उत्तर

66

यह वसंत दस्तावेज़ीकरण में Container Extension Points के बारे में स्पष्ट रूप से समझाया गया है।

BeanPostProcessor इंटरफ़ेस कॉलबैक तरीकों कि आप अपने खुद के प्रदान करने के लिए लागू कर सकते हैं (या कंटेनर की डिफ़ॉल्ट ओवरराइड) इन्स्टेन्शियशन तर्क, निर्भरता संकल्प तर्क, और इसके आगे परिभाषित करता है। यदि आप स्प्रिंग कंटेनर के बाद कुछ कस्टम तर्क लागू करना चाहते हैं तो एक बीन को तत्काल, कॉन्फ़िगर करना और प्रारंभ करना समाप्त करें, आप एक या अधिक बीनपोस्टप्रोसेसर कार्यान्वयन में प्लग कर सकते हैं।

तो सार में विधि postProcessBeforeInitialization BeanPostProcessor में परिभाषित कहा जाता हो जाता है (जैसा कि नाम से पता चलता) सेम के प्रारंभ और इसी तरह postProcessAfterInitialization से पहले सेम के प्रारंभ के बाद कहा जाता हो जाता है।

@PostConstruct, InitializingBean और कस्टम init विधि में अंतर यह है कि इन्हें बीन पर ही परिभाषित किया गया है। उनका ऑर्डरिंग वसंत दस्तावेज के Combining lifecycle mechanisms अनुभाग में पाया जा सकता है।

तो मूल रूप से बीनपोस्टप्रोसेसर का इस्तेमाल कई बीन्स के लिए कस्टम तत्काल तर्क करने के लिए किया जा सकता है, अन्य को प्रति बीन आधार पर परिभाषित किया जाता है।

8

BeanPostProcessor: एक BeanPostProcessor आप इसे बाद प्रारंभ जीवन चक्र घटना उदाहरण पर आ गई है फिर इन्स्टेन्शियशन है और फिर बाद आईओसी कंटेनर के द्वारा बनाई गई एक सेम का एक उदाहरण पर कार्रवाई करने के लिए एक मौका देता है। आप इसे सेट किए गए फ़ील्ड को संसाधित करने के लिए उपयोग कर सकते हैं, बीन पर सत्यापन कर सकते हैं, या बीम पर डिफ़ॉल्ट रूप से सेट करने के लिए दूरस्थ संसाधन से मूल्यों को भी देख सकते हैं।

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

init/नष्ट विधि: वसंत में, आप प्रारंभिकरण और विनाश पर कुछ क्रियाएं करने के लिए बीन के लिए बीन कॉन्फ़िगरेशन फ़ाइल में विशेषता के रूप में init-method और dest-method का उपयोग कर सकते हैं।

यहां आपको यह दिखाने के लिए एक उदाहरण दिया गया है कि इनिट-विधि और विनाश-विधि का उपयोग कैसे करें।

package com.xyz.customer.services; 

public class CustomerService 
{ 
    String message; 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void initIt() throws Exception { 
     System.out.println("Init method after properties are set : " + message); 
    } 

    public void cleanUp() throws Exception { 
     System.out.println("Spring Container is destroy! Customer clean up"); 
    } 

} 

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="customerService" class="com.xyz.customer.services.CustomerService" 
    init-method="initIt" destroy-method="cleanUp"> 

    <property name="message" value="i'm property message" /> 
</bean> 

+0

हैलो @kandarp, मैं थोड़ा ऊपर दो कथन 'कैशिंग के लिए वसंत के विभिन्न AOP प्रॉक्सी, लेन-देन आदि सभी BeanPostProcessors.' द्वारा लागू की गई हैं में उलझन में हूँ और' तो, किसी भी BeanPostProcessor आप बना लिए योग्य नहीं है एओपी प्रॉक्सी। 'दोनों एक-दूसरे से संघर्ष करते हैं। यही है ना अंत में, क्या हम किसी भी पोस्टप्रोसेसर बीन का उपयोग एओपी प्रॉक्सी के रूप में कर सकते हैं या नहीं? – Jaikrat

12

जवाब से ऊपर स्पष्ट रूप से बहुत महत्वपूर्ण पहलू के कुछ बताते हैं।

इसके अलावा यह समझना भी महत्वपूर्ण है कि बीनपोस्टप्रोसेसर और इनिट और नष्ट विधियां दोनों वसंत बीन जीवन चक्र का हिस्सा हैं।

बीनपोस्टप्रोसेसर कक्षा में दो विधियां हैं।

1) postProcessBeforeInitialization - जैसा कि नाम स्पष्ट रूप से कहता है कि यह सुनिश्चित करने के लिए प्रयोग किया जाता है कि प्रारंभिक क्रिया से पहले आवश्यक कार्रवाई की जाती है। जैसे आप रिमोट स्रोत/सेवा से कुछ संपत्ति फ़ाइल/डेटा को लोड करना चाहते हैं।

2) postProcessAfterInitialization - बीन संदर्भ से पहले प्रारंभ करने के बाद आप जो भी करना चाहते हैं उसे आवेदन के लिए दिया जाता है। जीवन चक्र में पूछताछ की विधियों में से

अनुक्रम इस प्रकार है:

1) BeanPostProcessor.postProcessBeforeInitialization()

2) init()

3) BeanPostProcessor.postProcessAfterInitialization()

4) नष्ट करें()

आप इसे सरल उदाहरण लिखकर जांच सकते हैं और उनकी जांच कर सकते हैं अनुक्रम।

4

और एक और मुख्य अंतर प्रारंभिक बीन है, डिस्पोजेबल बीन प्रॉपर्टीजसेट() & destory() विधियों ने किसी भी पैरामीटर और रिटर्न प्रकार को भी शून्य नहीं स्वीकार किया है, इसलिए हमने कोई कस्टम तर्क लागू नहीं किया है। लेकिन बीनपोस्टप्रोसेज विधियों के लिए आने के बाद पोस्टप्रोसेजप्रोइनइनाइजेशन (ऑब्जेक्ट बीन, स्ट्रिंग बीननाम) और पोस्टप्रोसेएफ़रइन्टाइलाइजेशन (ऑब्जेक्ट बीन, स्ट्रिंग बीननाम) उन दो पैरामीटर स्वीकार करते हैं और रिटर्न टाइप ऑब्जेक्ट भी स्वीकार करते हैं ताकि हम इनिटिलेजेशन लॉजिक के साथ-साथ किसी भी कस्टम लॉगिन के आधार पर लिख सकें इस प्रकार

1) BeanPostProcessor.postProcessBeforeInitilazation()

2) सेम गुजर ...

इन दोनों कॉलबैक विधि feautes सेम जीवन चक्र भी शामिल कर रहे हैं और निम्नलिखित जीवन चक्र हैं @postConstruct या InitializingBean .afterPropertiesSet() या प्रारंभिक विधि जोहै एक्सएमएल में परिभाषित करने/* यहां भी यह एक ही oredr अनुसरण कर रहा है, तो तीन तरीके availiable **/

3) BeanPostProcessor.postProcessAfterInitialization()

4) @preDestroy या DisposibleBean हैं।नष्ट() या विधि है जो एक्सएमएल /* यहाँ में परिभाषित करने है भी यह एक ही oredr अनुसरण कर रहा है, तो तीन तरीके availiable हैं नष्ट **/

0

घटक वसंत आईओसी कंटेनर में विनाश करने के लिए निर्माण से कई चरणों से होकर चला जाता है । इस घटक को बनाए जाने से पहले इसे इस घटक के कुछ प्रारंभिक संचालन करने की आवश्यकता हो सकती है। इसी तरह, आईओसी कंटेनर से घटक के विनाश और हटाने से पहले, कुछ परिचालनों की आवश्यकता हो सकती है। इस वसंत ढांचे के लिए घटक जीवन चक्र प्रबंधन के तरीकों को परिभाषित करने की अनुमति देता है।

  • BeanPostProcessor इंटरफेस और तरीका है जिसके init-method में निर्दिष्ट किया जाता घटक निर्माण के चरणों के लिए प्रासंगिक है। postProcessBeforeInitialization(), postProcessAfterInitialization():

घटक इंटरफेस BeanPostProcessor लागू करता है, तो वसंत आईओसी कंटेनर इस इंटरफेस के तरीकों कहता है। इसके बाद घटक उपयोग के लिए तैयार है और इसके विनाश से पहले आईओसी कंटेनर में रहेगा। विधि जो init-method विशेषता में निर्दिष्ट है, को इन दो तरीकों के बीच बुलाया जाएगा। (वास्तव में, इंटरफेस InitializingBean के afterPropertiesSet() विधि से पहले, यदि घटक इस इंटरफ़ेस को लागू करता है)।

  • DisposableBean इंटरफेस और तरीका है जिसके destroy-method में निर्दिष्ट किया जाता घटक विनाश के चरणों के लिए प्रासंगिक है।

घटक इंटरफेस DisposableBean लागू करता है, तो वसंत आईओसी इस इंटरफेस के कंटेनर कॉल विधि: destroy()। इसके बाद विधि destroy-method विशेषता में निर्दिष्ट विधि कहा जाएगा। इसके बाद घटक नष्ट हो गया है।

गुणों में सूचीबद्ध विधियों का उपयोग करना बेहतर है .. इंटरफेस का कार्यान्वयन BeanPostProcessor और DisposableBean घटकों और स्प्रिंग एपीआई के बीच युग्मन बनाता है।

3

कॉलबैक विधियों को इनिट और नष्ट करें वसंत बीन जीवन चक्र चरणों का हिस्सा हैं। बीन प्रारंभिकरण से पहले इनिट विधियों को निष्पादित किया जा रहा है। इसी प्रकार बीन विनाश से पहले विध्वंस विधि निष्पादित की जा रही है।

हम को लागू करने इंटरफेस InitializingBean और DisposableBean का उपयोग कर, या एनोटेशन @postconstruct और @predestroy का उपयोग कर इस कार्यक्षमता को लागू, या init-method और destroy-method विशेषताओं के साथ <bean> घोषणा कर सकते हैं।

बीनपोस्टप्रोसेसर इंटरफ़ेस का उपयोग फ्रेमवर्क की कार्यक्षमता को बढ़ाने के लिए किया जाता है यदि वसंत कंटेनर द्वारा बीन निर्माण से पहले और बाद में कोई कॉन्फ़िगरेशन करना है।

उदाहरण के लिए: डिफ़ॉल्ट रूप से, स्प्रिंग @PostConstruct और @PreDestroy एनोटेशन के बारे में पता नहीं होगा। इसे सक्षम करने के लिए, हमें या तो CommonAnnotationBeanPostProcessor पंजीकृत करना होगा या बीन कॉन्फ़िगरेशन फ़ाइल में <context:annotation-config /> निर्दिष्ट करना होगा। यहां CommonAnnotationBeanPostProcessor एनोटेशन के लिए BeanPostProcessor कार्यान्वयन पूर्वनिर्धारित है।जैसा:

@RequiredRequiredAnnotationBeanPostProcessor प्रसंस्करण उपकरण में सक्षम बनाता है
@AutowiredAutowiredAnnotationBeanPostProcessor प्रसंस्करण उपकरण

-1

क) postProcessBeforeInitialization() सेम के प्रारंभ से पहले बुलाया जाएगा सक्षम बनाता है।

ख) एक बार सेम प्रारंभ हो जाता है, अलग अलग तरीकों कॉलबैक स्प्रिंग डॉक्स के अनुसार निम्न क्रम में कहा जाता है:

  1. @PostConstruct
  2. afterPropertiesSet() के साथ एनोटेट तरीके के रूप में InitializingBean द्वारा परिभाषित किया गया कॉलबैक इंटरफ़ेस
  3. XML के माध्यम से परिभाषित init विधि।

मुख्य अंतर यह है कि शुरुआती 3 विधियों को पोस्टप्रोसेजइफर्नइनाइजेशन() विधि द्वारा प्रारंभ करने के बाद कॉल किया जाता है।

एक बार इन तरीकों विधि postProcessAfterInitialization() कहा जाएगा पूरा करने के लिए और फिर नष्ट तरीकों उसी क्रम में कहा जाता है:) के रूप में

  1. तरीके @PreDestroy

  2. नष्ट (के साथ एनोटेट डिस्पोजेबल बीन कॉलबैक इंटरफ़ेस द्वारा परिभाषित

  3. एक्सएमएल के माध्यम से परिभाषित विधि() विधि।

संबंधित मुद्दे