2011-06-06 9 views
12

पर काम करने का प्रतीत नहीं होता है, मुझे स्प्रिंग के एप्लिकेशन संदर्भ लोड होने के तुरंत बाद कुछ होने की आवश्यकता है। जैसा कि मैं इसे समझता हूं, मुझे लाइफसाइकिल का कार्यान्वयन करने और संदर्भ के अंदर एक बीन संदर्भ डालने की आवश्यकता है। तो मैं अपने संदर्भ में कुछ इस तरह है:मुझे स्प्रिंग्स लाइफसाइकिल

<bean id="mySpringLifecycle" class="com.my.project.MySpringLifecycle" /> 

वर्ग इस तरह दिखता है: "। जीवन चक्र शुरू हो गया है"

public class MySpringLifecycle implements Lifecycle { 

    @Override 
    public void start() { 
     System.out.println("The lifecycle has started."); 
    } 

    @Override 
    public void stop() { 
     return; 
    } 

    @Override 
    public boolean isRunning() { 
     return true; 
    } 
} 

मैं कोई त्रुटि मिलती है, लेकिन MySpringLifecycle कभी बाहर प्रिंट, और मेरा आवेदन ठीक शुरू होता है।

संपादित करें:

यह निश्चित कोड है:

public class MySpringLifecycle implements SmartLifecycle { 

    private volatile boolean isRunning = false; 

    @Override 
    public boolean isAutoStartup() { 
     return true; 
    } 

    @Override 
    public void stop(Runnable r) { 
     System.out.println("STOPPED RUNNABLE!!!"); 
     isRunning = false; 
    } 

    @Override 
    public void start() { 
     System.out.println("STARTED!!!"); 
     isRunning = true; 
    } 

    @Override 
    public void stop() { 
     System.out.println("STOPPED!!!"); 
     isRunning = false; 
    } 

    @Override 
    public boolean isRunning() { 
     return isRunning; 
    } 

    @Override 
    public int getPhase() { 
     return 1; 
    } 
} 

एक तरफ ध्यान दें मैं भी कोई वैकल्पिक समाधान है कि मैं भी उपयोग कर सकते हैं उल्लेख करना चाहता था के रूप में।

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/spring.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

ContextLoaderListener एक विधि पर यह contextInitialized कहा जाता है: मैं अपने web.xml में निम्नलिखित है। तो मैंने जो किया वह मेरा अपना कार्यान्वयन बनाया गया और इसके बजाय web.xml में जोड़ा गया। मेरे कार्यान्वयन में मैंने ContextLoaderListener को विस्तारित किया, संदर्भ के लिए ओवरराइड प्रदान किया गया प्रारंभिक विधि, जिसे पहले उस विधि के लिए सुपर कहा जाता था, और फिर अपनी कार्यक्षमता निष्पादित की गई। यह केवल एक बार निष्पादित हो जाता है, और अच्छी तरह से काम करता प्रतीत होता है।

+0

http://static.springsource.org/spring/docs/3.0.x/reference/beans.html#beans-factory-lifecycle-processor से उद्धरित आप द्वारा परिभाषित रोक विधि देख सकते हैं SmartLifecycle कॉलबैक स्वीकार करता है। कार्यान्वयन की शटडाउन प्रक्रिया पूरी होने के बाद किसी भी कार्यान्वयन को कॉलबैक की रन() विधि का आह्वान करना होगा। – BPS

+0

क्या होगा यदि आपकी कक्षा अतिरिक्त रूप से एक और कक्षा का विस्तार करे। इसके अलावा उल्लिखित वर्ग वसंत <बीन = "myBean"> में परिभाषित किया गया है। अपने वर्ग उदाहरण में इन पैरामीटर को तुरंत कैसे चालू करें? – luksmir

उत्तर

9

दो तरीके:

  1. Lifecycle के बजाय SmartLifecycle कार्यान्वित करके isAutoStartup() से true वापस जाने के लिए सुनिश्चित करें।

  2. लागू ApplicationListener<ContextRefreshedEvent>। इस मामले में SmartLifecycle के लिए 6 के बजाय लागू करने के लिए केवल एक ही विधि है।

+0

दुर्भाग्यवश, ContextRefreshedEvent को स्टार्टअप के दौरान कई बार बुलाया जाता है, न केवल एक बार। मैंने ContextStartedEvent को आजमाया, लेकिन यह एप्लिकेशन स्टार्टअप पर आग नहीं लगाता क्योंकि डिफ़ॉल्ट जीवन चक्र प्रारंभ() को कॉल करने के लिए प्रकट नहीं होता है। –

+0

जब मैं स्मार्ट लाइफसाइक्ल को कार्यान्वित करता हूं तो केवल एक ही चीज़ कहलाती है जो सार्वजनिक शून्य स्टॉप (रननेबल आर) ओवरराइड है। स्पष्ट रूप से कुछ कार्यान्वयन विवरण हैं जो मुझे यह काम करने के लिए याद आ रही हैं। –

+2

सुनिश्चित करें कि 'isRunning()' '' ('' '' '' '' '' '' 'है। 'रोकना()' तब तक नहीं बुलाया जाएगा जब तक कि 'isRunning()' सही नहीं होता है। – sourcedelica

0

मुझे यकीन नहीं है, लेकिन might को LifecycleProcessor की आवश्यकता है, एक या अधिक Lifecycle ऑब्जेक्ट्स के अतिरिक्त।

+0

नहीं - एक डिफ़ॉल्ट लाइफसाइसेप्रोसेसर स्वचालित रूप से संदर्भ में जोड़ा जाता है। – sourcedelica

0

'वसंत के आवेदन संदर्भ के तुरंत बाद' के आधार पर आपका क्या मतलब है, इसके आधार पर, आरंभिक बीन का कार्यान्वयन आप जो खोज रहे हैं वह हो सकता है। लाइफसाइकल बहुत कम स्तर वाला हो सकता है।

+0

'प्रारंभिक बीन # के बाद प्रॉपर्टीजसेट()' संदर्भ को पूरी तरह से निर्मित करने से पहले बुलाया जाता है, इसलिए यदि आप किसी अन्य बीन पर निर्भर करते हैं तो बुरी चीजें हो सकती हैं। – sourcedelica

1

आप MySpringLifecycle संशोधित करते हैं के रूप में आप उन्हें होने की उम्मीद को लागू करने के SmartLifecycle बजाय Lifecycle, अपने स्निपेट में System.outs प्रिंट किया जाएगा। यह करने के लिए

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