2015-04-20 7 views
43

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

तो मैं इस स्कीमा है:

enter image description here

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

लोड बीन परिभाषाएँ चरण होता है में

कि:

  • @ कॉन्फ़िगरेशन कक्षाएं प्रक्रिया हैं एड और/या @ कॉम्पोनेंट्स स्कैन किए गए हैं और/या XML फ़ाइलों पार्स किए गए हैं।

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

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

फिर सेम निर्माण चरण में होता यह है कि: (अपनी निर्भरता इंजेक्शन सही क्रम में बनाया)

  • प्रत्येक फली बेसब्री से डिफ़ॉल्ट रूप से instantiated है।

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

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

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

  • initializers: सेम प्रारंभ करता है, तो निर्देश दिए (यानी @PostConstruct) हैं कि सेम पोस्ट प्रोसेसर के दो प्रकार हैं।

  • सभी बाकी: कि अतिरिक्त विन्यास के लिए अनुमति देते हैं और मैं इस स्लाइड पोस्ट कि से पहले या इनिशियलाइज़ कदम

होने लग जाते हैं और हो सकता है:

enter image description here

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

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

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

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

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

Tnx

उत्तर

23

स्प्रिंग डॉक Customizing beans using BeanPostProcessor तहत BPPs बताते हैं। बीपीपी बीन्स एक विशेष प्रकार के सेम होते हैं जो किसी अन्य बीन्स से पहले बनाए जाते हैं और नव निर्मित बीन्स के साथ बातचीत करते हैं। इस निर्माण के साथ, स्प्रिंग आपको BeanPostProcessor को लागू करके बस जीवन चक्र व्यवहार को हुक-अप और अनुकूलित करने का मतलब देता है।

तरह

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; 
    } 
} 

कहा जाता है और हर बनाया सेम के लिए बाहर वर्ग और सेम नाम मुद्रित किया जाएगा एक कस्टम बीपीपी होने।

undersand करने के लिए कैसे विधि सेम के जीवनचक्र फिट है, और जब वास्तव में विधि का कहा जाता हो docs

postProcessBeforeInitialization (वस्तु सेम, स्ट्रिंग beanName) जाँच , जिन्हें नए सेम उदाहरण के लिए इस BeanPostProcessor लागू करें किसी भी बीन प्रारंभिक कॉलबैक से पहले (जैसे प्रारंभिक बीन के बाद प्रॉपर्टीजसेट या कस्टम इनिट-विधि)।

postProcessAfterInitialization (वस्तु सेम, स्ट्रिंग beanName) किसी भी सेम प्रारंभ कॉलबैक के बाद लागू करें , जिन्हें नए सेम उदाहरण के लिए इस BeanPostProcessor (InitializingBean के afterPropertiesSet या एक कस्टम init-विधि की तरह)।

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

सेम पहले से ही संपत्ति मूल्यों के साथ भरे जाएंगे।

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

। चाहे @PostConstruct विधि से पहले या किसी अन्य postProcessAfterInitialization के बाद निष्पादित करेंगे order संपत्ति पर निर्भर करता है

आप एक से अधिक BeanPostProcessor उदाहरणों कॉन्फ़िगर कर सकते हैं, और आप जिस क्रम में इन BeanPostProcessors क्रम संपत्ति की स्थापना द्वारा निष्पादित नियंत्रित कर सकते हैं।

15

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

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

+2

वास्तविक जीवन उदाहरण के लिए कुडोस! – raiks

+0

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

0

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

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

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