Jak zamknąć sprężynę ApplicationContext?

85

Po zakończeniu aplikacji chcę zamknąć kontekst wiosenny.
Odpowiedni kod ma ApplicationContextodniesienie, ale nie mogłem znaleźć closemetody.

Avner Levy
źródło

Odpowiedzi:

150

Downcast your ApplicationContextto ConfigurableApplicationContextwhich defines close()method:

((ConfigurableApplicationContext)appCtx).close();
Tomasz Nurkiewicz
źródło
13
Możesz także AbstractApplicationContext
przesyłać
3
@eeezyy - Ponieważ AbstractApplicationContextjest to klasa i ConfigurableApplicationContextjest interfejsem zaimplementowanym przez tę klasę, w większości przypadków prawdopodobnie lepiej jest używać tej drugiej.
Periata Breatta
3
Jak ConfigurableApplicationContextteraz rozciąga Closable(nie wiem, która wersja ta zmiana została dokonana w, ale docs dla 4.2.x pokazują, że podczas gdy 3.0.x nie) znacznie krótsza wersja jest ((Closable)context).close();.
Periata Breatta
6
Jest teraz również AutoCloseableimplementacja, co oznacza, że ​​można teraz użyć AutoCloseabletry (ConfigurableApplicationContext context = new ....) { /* your code goes here */ } // context is closed when you leave the try block
zasobów próbnych
Gdzie mam zamknąć kontekst? Mam aplikację nasłuchującą, która stale otrzymuje komunikaty za pośrednictwem metody onMessage () klasy MessageListener. W której części powinienem zamknąć kontekst aplikacji, aby ostatecznie zamknąć moduł wykonawczy?
Wosk
36

Musisz zarejestrować punkt zaczepienia zamykania w JVM, jak pokazano poniżej:

((AbstractApplicationContext)appCtx).registerShutdownHook();

Aby uzyskać więcej informacji, zobacz: Podręcznik Spring: 3.6.1.6 Bezpieczne zamykanie kontenera Spring IoC w aplikacjach innych niż internetowe

dogbane
źródło
Co dziwne, to nie działa dla mnie w klasie testowej, ale użycie odpowiedzi Avner Levy na końcu main () działa.
JReader
1
@JReader - punkty zaczepienia zamykania systemu nie są niezawodne w wielu okolicznościach i nie są uruchamiane przez większość struktur testowych (ponieważ zwykle maszyna wirtualna faktycznie nie zamyka się między uruchomieniem testów) lub kilka struktur aplikacji (np. Serwlety - wszystko, co może zakończyć i ponownie załadować aplikację bez zamykania maszyny wirtualnej w zasadzie). Prawdopodobnie nie powinieneś ich używać, chyba że wiesz, co robisz i jak twój kod zostanie użyty ..
Periata Breatta
14

Jeśli zainicjujesz kontekst jak poniżej

ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

czysty kontekst, taki jak te

((ClassPathXmlApplicationContext) context).close();
Ashish Gaikwad
źródło
12

Jeśli Java SE 7 i nowsze wersje , nie zamykaj, użyj try-with-resources, co zapewni, że każdy zasób zostanie zamknięty na końcu instrukcji.

try(final AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:META-INF/spring/*.xml" }))
{
     //write your code
}
Chirag
źródło
1

Kroki, aby zamknąć ApplicationContextobiekt

  1. Wpisz Prześlij ApplicationContextobiekt do ConfigurableApplicationContextobiektu.
  2. następnie wywołaj na tym obiekt close.

przykład:

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

((ConfigurableApplicationContext)context ).close();
pushpendra yadav
źródło
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();
Meenakshi Singh
źródło
1
Odpowiadając na stary post, pomocne byłoby podanie kontekstu odpowiedzi, a nie tylko kodu, ponieważ może to uczynić ją bardziej użyteczną dla innych.
David Buck,