स्प्रिंग बीनपोस्टप्रोसेसर कितना सही काम करता है?


94

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

इसलिए मेरे पास यह स्कीमा है:

यहां छवि विवरण दर्ज करें

यह मेरे लिए बहुत स्पष्ट है कि इसका क्या अर्थ है:

निम्नलिखित चरण लोड बीन परिभाषाओं के चरण में होते हैं:

  • @Configuration कक्षाएं कार्रवाई की जाती है और / या @Components के लिए और / या स्कैन किए जाते हैं एक्सएमएल फाइल पार्स कर रहे हैं।

  • बीन की परिभाषाएं बीनफैक्ट्री में जोड़ दी गईं (प्रत्येक अपनी आईडी के तहत अनुक्रमित)

  • विशेष बीनफैक्टरीपोस्टप्रोसेसर बीन्स को आमंत्रित किया गया, यह किसी भी बीन की परिभाषा को संशोधित कर सकता है (उदाहरण के लिए संपत्ति-प्लेसहोल्डर मान प्रतिस्थापन के लिए)।

फिर सेम के निर्माण के चरण में निम्नलिखित कदम उठाए जाते हैं :

  • प्रत्येक बीन को डिफ़ॉल्ट रूप से तुरंत तैयार किया जाता है (इंजेक्शन के साथ इसकी निर्भरता के साथ सही क्रम में बनाया गया)।

  • निर्भरता इंजेक्शन के बाद प्रत्येक बीन एक पोस्ट-प्रोसेसिंग चरण के माध्यम से जाता है जिसमें आगे कॉन्फ़िगरेशन और प्रारंभ हो सकता है।

  • पोस्ट प्रोसेसिंग के बाद बीन पूरी तरह से इनिशियलाइज़ हो जाता है और उपयोग के लिए तैयार हो जाता है (संदर्भ नष्ट होने तक इसकी आईडी द्वारा ट्रैक किया जाता है)

ठीक है, यह मेरे लिए बहुत स्पष्ट है और मुझे यह भी पता है कि सेम पोस्ट प्रोसेसर दो प्रकार के होते हैं:

  • इनिशियलाइज़र्स: यदि निर्देश दिया गया है तो बीन को इनिशियलाइज़ करें (यानी @PostConstruct)।

  • और बाकी सभी: जो अतिरिक्त कॉन्फ़िगरेशन के लिए अनुमति देते हैं और जो प्रारंभिक चरण के पहले या बाद में चल सकते हैं

और मैं इस स्लाइड को पोस्ट करता हूं:

यहां छवि विवरण दर्ज करें

तो यह मेरे लिए बहुत स्पष्ट है कि इनिशियलाइज़र बीन पोस्ट प्रोसेसर क्या है (वे @PostContruct एनोटेशन के साथ एनोटेट किए गए तरीके हैं और इसे सेटर विधियों (निर्भरता इंजेक्शन के बाद) के तुरंत बाद कहा जाता है, और मुझे पता है कि मैं इसका उपयोग कर सकता हूं कुछ इनिशियलाइज़ेशन बैच निष्पादित करें (जैसा कि पिछले उदाहरण में कैश को पॉप्युलेट करें)।

लेकिन क्या वास्तव में अन्य सेम पोस्ट प्रोसेसर का प्रतिनिधित्व करता है? जब हम कहते हैं कि इन चरणों को प्रारंभिक चरण के पहले या बाद में किया जाता है, तो हमारा क्या मतलब है ?

इसलिए मेरी फलियों को तुरंत लगाया जाता है और इसकी निर्भरता को इंजेक्ट किया जाता है, इसलिए तब इनिशियलाइज़ेशन चरण पूरा हो जाता है ( @PostContruct एनोटेट विधि के निष्पादन के द्वारा )। हम यह कहने से क्या मतलब है कि एक बीन पोस्ट प्रोसेसर का उपयोग आरंभीकरण चरण से पहले किया जाता है? इसका मतलब है कि यह @PostContruct एनोटेट विधि निष्पादन से पहले होता है ? क्या इसका मतलब है कि यह निर्भरता इंजेक्शन से पहले हो सकता है (इससे पहले कि सेटर तरीकों को कहा जाता है)?

और हम वास्तव में क्या मतलब है जब हम कहते हैं कि यह इनिशियलाइज़ेशन चरण के बाद किया जाता है । इसका मतलब है कि यह तब होता है जब @PostContruct एनोटेट विधि का निष्पादन , या क्या?

मैं आसानी से अपने सिर में पता लगा सकता हूं कि मुझे @PostContruct एनोटेट विधि की आवश्यकता क्यों है लेकिन मैं दूसरे प्रकार के बीन पोस्ट प्रोसेसर के कुछ विशिष्ट उदाहरण का पता नहीं लगा सकता, क्या आप मुझे कुछ विशिष्ट उदाहरण दिखा सकते हैं कि कब उपयोग किया जाता है?


मुझे पूरा यकीन है कि आपको स्लाइड्स की तस्वीरें साझा नहीं करनी चाहिए :)
Reg

@ क्या सही पाठ्यक्रम / प्रस्तुति से ये चित्र हैं?
मालवोन

@Malvon यह Pivotal के आधिकारिक स्प्रिंग कोर पाठ्यक्रम के पिछले संस्करण से था। और BTW - यदि आप परीक्षा की तैयारी कर रहे हैं, तो XML के साथ कुछ भी अनदेखा करें :)
Reg

@ क्या वास्तव में प्रशिक्षण वर्गों में शामिल हुए बिना कोर्स खरीदने का कोई तरीका है?
मालवोन

मैं सोच रहा हूँ कि आरेख "पोस्ट प्रोसेस बीन डेफिशिएंसी" के उस बैंगनी हिस्से में क्या होता है?
अक्षय हिरेमथ

जवाबों:


48

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

जैसे कस्टम BPP होना

public class CustomBeanPostProcessor implements BeanPostProcessor {

    public CustomBeanPostProcessor() {
        System.out.println("0. Spring calls constructor");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println(bean.getClass() + "  " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println(bean.getClass() + "  " + beanName);
        return bean;
    }
}

बुलाया जाएगा और प्रत्येक बनाए गए बीन के लिए वर्ग और बीन का नाम प्रिंट करें।

यह समझने के लिए कि विधि बीन के जीवनचक्र में कैसे फिट होती है, और जब वास्तव में विधि की जाँच को डॉक्स कहा जाता है

postProcessBeforeInitialization (ऑब्जेक्ट बीन, स्ट्रिंग बीननाम) इस बीनपॉस्टप्रोसेसर को किसी भी सेम इनिशियलाइज़ेशन कॉलबैक से पहले दिए गए नए सेम उदाहरण पर लागू करें (जैसे कि InitializingBean के afterProperties.et या एक कस्टम इनिट-विधि)।

postProcessAfterInitialization (ऑब्जेक्ट बीन, स्ट्रिंग बीननाम) इस बीनपॉस्टप्रोसेसर को किसी भी बीन इनिशियलाइज़ेशन कॉलबैक (जैसे कि InitializingBean के afterPropertiesSub या एक कस्टम इन-विधि) के बाद दिए गए नए सेम उदाहरण पर लागू करें।

महत्वपूर्ण बिट वह भी है

बीन को पहले से ही संपत्ति मूल्यों के साथ आबाद किया जाएगा।

@PostConstructध्यान दें कि इस एनोटेशन का postProcessAfterInitializationविधि के साथ संबंध की चिंता के लिए एक विधि घोषित करने का एक सुविधाजनक तरीका है , और स्प्रिंग को इसके बारे में तब पता चलता है जब आप या तो बीन कॉन्फ़िगरेशन फ़ाइल में रजिस्टर CommonAnnotationBeanPostProcessorया निर्दिष्ट करते हैं <context:annotation-config />। क्या @PostConstructविधि किसी अन्य के पहले या बाद में निष्पादित होगी या नहीं postProcessAfterInitializationयह orderसंपत्ति पर निर्भर करता है

आप कई बीनपोस्टप्रोसेसर को कॉन्फ़िगर कर सकते हैं, और आप उस ऑर्डर को नियंत्रित कर सकते हैं जिसमें ये बीनपोस्टप्रोसेसर ऑर्डर प्रॉपर्टी सेट करके निष्पादित करते हैं।


30

बीन पोस्ट प्रोसेसर के लिए विशिष्ट उदाहरण तब होता है जब आप मूल बीन को एक प्रॉक्सी उदाहरण में लपेटना चाहते हैं, जैसे @Transactionalएनोटेशन का उपयोग करते समय ।

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


6
एक वास्तविक जीवन उदाहरण के लिए यश!
11

वास्तविक उपयोग-मामला और न केवल सिद्धांत प्रदान करने के लिए धन्यवाद
अमोल अग्रवाल

4

अंतर BeanPostProcessorसंदर्भ प्रारंभ में हुक होगा फिर कॉल postProcessBeforeInitializationऔर postProcessAfterInitializationसभी परिभाषित बीन्स के लिए।

लेकिन @PostConstructबस उस विशिष्ट वर्ग के लिए उपयोग किया जाता है जिसे आप निर्माता या सेट विधि के बाद बीन निर्माण को अनुकूलित करना चाहते हैं।

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