2013-05-28 19 views
7

Edytuj: To pytanie nie jest takie samo jak When does destroy method is called, ponieważ poprawnie dzwonię pod numer context.registerShutdownHook, a moja fasola otrzymuje destory, jak widać z dzienników. Moim problemem jest wiosna, która nie nazywa mojej metody. Sprawdziłem to pytanie zanim zapytam tutaj.Metoda Destroy nie działa w wiosennej wersji językowej

Konfiguruję zgrabne niszczenie w mojej aplikacji przy użyciu frameworka sprężynowego. Gdy uruchomię program, nie wywołuje on metody destory określonej w pliku bean.xml. Pomóż mi, co robię źle.

tutaj jest SSCCE

Bean.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="helloworld" class="com.hello.pojo.HelloWorld" 
      scope="prototype" init-method="init" destroy-method="destroy"> 
    </bean> 

</beans> 

HelloWord.java

package com.hello.pojo; 

public class HelloWorld { 


    private String message; 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void init(){ 
     System.out.println("Bean initializating is in progress"); 
    } 

    public void printMessage(){ 
     System.out.println("Your message: "+getMessage()); 
    } 
    public void destroy(){ 
     System.out.println("Bean is being destroyed"); 
    } 

} 

MainApp.java

package com.main; 

import org.springframework.context.support.AbstractApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import com.hello.pojo.HelloWorld; 


public class MainApp { 

    public static void main(String[]args){ 
     AbstractApplicationContext context = new ClassPathXmlApplicationContext("Bean.xml"); 
     HelloWorld objA = (HelloWorld) context.getBean("helloworld"); 
     objA.setMessage("I am Object A"); 
     objA.printMessage(); 
     context.registerShutdownHook(); 
    } 

} 

Wyjście

May 27, 2013 11:59:14 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org[email protected]e9028874: startup date [Mon May 27 23:59:14 EDT 2013]; root of context hierarchy 
May 27, 2013 11:59:14 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [Bean.xml] 
Bean initializating is in progress 
Your message: I am Object A 
May 27, 2013 11:59:14 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
INFO: Pre-instantiating singletons in org.s[email protected]63390b47: defining beans [helloworld]; root of factory hierarchy 
May 27, 2013 11:59:14 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose 
INFO: Closing org[email protected]e9028874: startup date [Mon May 27 23:59:14 EDT 2013]; root of context hierarchy 
May 27, 2013 11:59:14 PM org.springframework.beans.factory.support.DefaultListableBeanFactory destroySingletons 
INFO: Destroying singletons in org.s[email protected]63390b47: defining beans [helloworld]; root of factory hierarchy 

Poprawka: Próbowałem close i registerShutdownHook() zamknąć kontekst i żaden z nich nie działa.

+0

@MadProgrammer Myślę, że możemy skonfigurować metodę z dowolną nazwą w pliku bean.xml, o ile oba mają taką samą nazwę. Chociaż próbowałem również z niszczeniem i nie działa – Ashish

+0

@MadProgrammer Myślę, że masz na myśli 'zniszczyć', a nie' destory';) – Vulcan

+0

@Vulcan Myślę, że mam na myśli piwo;) – MadProgrammer

Odpowiedz

32

Metoda Destroy nie jest wywoływana dla fasoli prototypu zakresu. Dzieje się tak dlatego, że kontekst nie śledzi prototypowych obiektów oscyloskopu (jeśli tak, spowoduje to wyciek pamięci, ponieważ wiosna nie wie, kiedy go usunąć).

Szczegóły z dokumentacji sprężyny.

Spring reference documentation

Jest jedna bardzo ważna rzecz, aby mieć świadomość, kiedy wdrażania fasoli w ramach prototypu, że cykl życia fasoli zmienia nieznacznie. Spring nie zarządza pełnym cyklem życia prototypowej fasoli: kontener tworzy instancje, konfiguruje, ozdabia i w inny sposób składa obiekt prototypowy, przekazuje go klientowi, a następnie nie ma dodatkowej wiedzy o tej prototypowej instancji. Oznacza to, że podczas gdy metody wywołania zwrotnego cyklu życia inicjalizacji będą wywoływane na wszystkich obiektach niezależnie od zakresu, w przypadku prototypów wszelkie skonfigurowane wywołania cyklu życia destrukcji nie będą wywoływane.

+0

Wielkie dzięki, usunąłem prototyp i zaczęło działać zgodnie z oczekiwaniami. – Ashish

+0

Dziękuję bardzo –

Powiązane problemy