2013-05-28 14 views
7

Edit: Questa domanda non è uguale a When does destroy method is called perché sto chiamando correttamente context.registerShutdownHook e il mio fagiolo è diventando Destory come si può vedere dai log. Il mio problema è che la primavera non sta chiamando il mio metodo. Ho controllato questa domanda prima di chiedere qui.Distruggere il metodo non funziona nel quadro primavera

Sto configurando il grazioso distruggere nella mia applicazione utilizzando la struttura a molla. Quando eseguo il programma, non chiama il metodo destory specificato in bean.xml. Per favore aiutami cosa sto sbagliando.

qui è 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(); 
    } 

} 

uscita

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 

emendamento: Ho provato close e registerShutdownHook() per chiudere il contesto e nessuno di loro opere.

+0

@MadProgrammer Penso che possiamo configurare il metodo con qualsiasi nome in bean.xml purché abbiano entrambi lo stesso nome. Anche se ho provato a distruggere e non funziona – Ashish

+0

@MadProgrammer penso che tu voglia dire 'destroy', non' destory';) – Vulcan

+0

@Vulcan penso che io intenda birra;) – MadProgrammer

risposta

32

Il metodo Destroy non viene chiamato per il prototipo di bean of scope. Questo perché il contesto non tiene traccia degli oggetti del prototipo scope (se lo fa, causerà una perdita di memoria in quanto spring non sa quando disporlo).

Dettagli dalla documentazione di primavera.

Spring reference documentation

C'è una cosa abbastanza importante da essere a conoscenza di quando si distribuisce un fagioli nel campo di applicazione del prototipo, in quanto il ciclo di vita del chicco cambia un po '. Spring non gestisce il ciclo di vita completo di un prototipo di bean : il contenitore crea un'istanza, configura, decora e in caso contrario assembla un oggetto prototipo, lo passa al client e quindi non ha ulteriori informazioni sull'istanza di prototipo dello . Ciò significa che mentre i metodi di callback del ciclo di vita dell'inizializzazione verranno richiamati su tutti gli oggetti indipendentemente dall'ambito, nel caso dei prototipi, non verranno richiamati tutti i callback del ciclo di vita di distruzione di distruzione configurati.

+0

Grazie mille, ho rimosso il prototipo e ha iniziato a funzionare come previsto. – Ashish

+0

Grazie mille –

Problemi correlati