स्प्रिंगकोटेक्स्ट कैसे बंद करें?


85

मेरे आवेदन के पूरा होने के बाद मैं वसंत संदर्भ बंद करना चाहता हूं।
प्रासंगिक कोड का एक ApplicationContextसंदर्भ है, लेकिन मुझे कोई closeविधि नहीं मिली ।

जवाबों:


150

डाउनकास्ट ApplicationContextकरने के लिए अपनी विधि ConfigurableApplicationContextपरिभाषित करता close()है:

((ConfigurableApplicationContext)appCtx).close();

13
तुम भी पर कास्ट कर सकतेAbstractApplicationContext
eeezyy

3
@eeezyy - जैसा AbstractApplicationContextकि एक वर्ग है और ConfigurableApplicationContextउस वर्ग द्वारा लागू किया गया एक इंटरफ़ेस है, ज्यादातर मामलों में उत्तरार्द्ध का उपयोग करना शायद बेहतर होता है।
पेरियाटा ब्रीटा

3
जैसा कि ConfigurableApplicationContextअब विस्तार होता है Closable(यह नहीं जानते कि यह परिवर्तन किस संस्करण में किया गया था, लेकिन 4.2.x के लिए डॉक्स इसे दिखाते हैं जबकि 3.0.x नहीं) बहुत छोटा संस्करण है ((Closable)context).close();
पेरियाटा ब्रीटा

6
अब एक AutoCloseableकार्यान्वयन भी है , जिसका अर्थ है कि एक कोशिश के साथ संसाधनों का उपयोग किया जा सकता है, जब तक कि आप अपना संदर्भ एक चर में संग्रहीत करते हैं जहां AutoCloseableइंटरफ़ेस दिखाई देता है, अर्थातtry (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
Periata Breatta

मुझे संदर्भ कहां बंद करना चाहिए? मेरे पास एक श्रोता अनुप्रयोग है जो लगातार मैसेजलिंटरर वर्ग के ऑनमैसेज () विधि के माध्यम से संदेश प्राप्त करता है। अंतिम रूप से निष्पादक को बंद करने के लिए मुझे आवेदन के संदर्भ में किस भाग को बंद करना चाहिए?
वैक्स

36

आपको जेवीएम के साथ शटडाउन हुक को पंजीकृत करने की आवश्यकता है जैसा कि नीचे दिखाया गया है:

((AbstractApplicationContext)appCtx).registerShutdownHook();

अधिक जानकारी के लिए देखें: स्प्रिंग मैनुअल: 3.6.1.6 गैर-वेब अनुप्रयोगों में शान से आईओसी कंटेनर को बंद करना


अजीब तरह से, यह मेरे लिए एक परीक्षण वर्ग में काम नहीं करता है, लेकिन मुख्य () के अंत में एवेर लेवी के जवाब का उपयोग करके काम करता है।
15:23 बजे JReader

1
@JReader - शटडाउन हुक कई परिस्थितियों में विश्वसनीय नहीं होते हैं, और अधिकांश परीक्षण रूपरेखाओं द्वारा नहीं चलाए जाते हैं (क्योंकि आमतौर पर वीएम वास्तव में रनिंग परीक्षणों के बीच नहीं छोड़ते हैं) या काफी कुछ अनुप्रयोग चौखटे। (जैसे सर्वलेट - कुछ भी। समाप्त करें और वर्चुअल मशीन को समाप्त किए बिना किसी एप्लिकेशन को पुनः लोड करें, मूल रूप से)। जब तक आप जानते हैं कि आप क्या कर रहे हैं और आपके कोड का उपयोग कैसे किया जाएगा, आपको शायद उनका उपयोग नहीं करना चाहिए ..
Periata Breatta

14

यदि आप संदर्भ को नीचे की तरह शुरू करते हैं

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

इन जैसे स्वच्छ संदर्भ

((ClassPathXmlApplicationContext) context).close();

12

यदि जावा एसई 7 और बाद में , बंद न करें, तो कोशिश के साथ संसाधनों का उपयोग करें जो यह सुनिश्चित करता है कि प्रत्येक संसाधन बयान के अंत में बंद है।

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
{
     //write your code
}

1

ApplicationContextऑब्जेक्ट को बंद करने के लिए कदम

  1. ApplicationContextऑब्जेक्ट को ConfigurableApplicationContextऑब्जेक्ट टाइप करें ।
  2. फिर उस पर करीब वस्तु को बुलाओ।

उदाहरण:

 ApplicationContext context = new ClassPathXmlApplicationContext("mybeans.xml");

((ConfigurableApplicationContext)context ).close();

1
public static void main(String[] args) {
    ApplicationContext context=new ClassPathXmlApplicationContext("SpringCnf.xml");
    Resturant rstro1=(Resturant)context.getBean("resturantBean");
    rstro1.setWelcome("hello user");
    rstro1.welcomeNote();
    ((ClassPathXmlApplicationContext) context).close();

1
किसी पुरानी पोस्ट का उत्तर देते समय, यह उपयोगी होगा यदि आप केवल कोड के बजाय अपने उत्तर के लिए कुछ संदर्भ प्रदान कर सकते हैं, क्योंकि यह इसे दूसरों के लिए अधिक उपयोगी बना सकता है।
डेविड बक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.