2010-12-16 8 views
20

Umieściłem polecenie sysout w "metodzie zniszczeń" dla fasoli. Kiedy uruchamiam przykładowy kod, sysout nie otrzymuje danych wyjściowych. Czy to oznacza, że ​​metoda destrukcji nie jest wywoływana?Kiedy wywoływana jest metoda fasoli szparagowej?

Klasa Test:

package spring.test; 

    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.support.ClassPathXmlApplicationContext; 

    public class InitTest { 
    public static void main(String[] args) { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("InitTestContext.xml"); 
     InitTestBean bean = (InitTestBean)ctx.getBean("InitTestBean"); 
     bean.display(); 
    } 
    } 

The Bean

package spring.test; 

    public class InitTestBean { 
    private String prop1; 
    private String prop2; 

    public InitTestBean(String prop1, String prop2) { 
     System.out.println("Instantiating InitTestBean"); 
     this.prop1 = prop1; 
     this.prop2 = prop2; 
    } 

    public void setProp1(String prop1) { 
     System.out.println("In setProp1"); 
     this.prop1 = prop1; 
    } 

    public void setProp2(String prop2) { 
     System.out.println("In setProp2"); 
     this.prop2 = prop2; 
    } 

    public String getProp1() { 
     return prop1; 
    } 

    public String getProp2() { 
     return prop2; 
    } 

    public void display() { 
     System.out.println("Prop1 is " + prop1); 
     System.out.println("Prop2 is " + prop2); 
    } 

    public void initialize(){ 
     System.out.println("In initialize"); 
     this.prop1 = "init-prop1"; 
     this.prop2 = "init-prop2"; 
    } 

    public void teardown() { 
     System.out.println("In teardown"); 
     this.prop1 = null; 
     this.prop2 = null; 
    } 
    } 

pliku konfiguracyjnym:

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

    <bean id="InitTestBean" class="spring.test.InitTestBean" init-method="initialize" destroy-method="teardown"> 
     <constructor-arg value="Prop1" /> 
     <constructor-arg value="Prop2" /> 
     <property name="prop1" value="setProp1"/> 
     <property name="prop2" value="setProp2"/> 
    </bean> 

</beans> 
+0

destroy-method działa dobrze. Pokaż nam swój kod i konfigurację. – skaffman

+0

To powinno być jak [to] (http://www.java2s.com/Code/Java/Spring/DestroyMethod.htm) –

+0

Nie masz spustu, by dać Wam znać, że się zamykasz. Jak zauważyli inni, musisz o tym wiedzieć, niż zamknąć otoczenie jako całość. – asgs

Odpowiedz

27

Twój przykład nie działa, ponieważ nie jesteś wyłączania appcontext , po prostu pozwalasz zakończyć program.

Zadzwoń pod close() na temat kontekstu, a zobaczysz, jak nazywa się metody niszczenia fasoli.

+1

Nie ma zamkniętej metody dostępnej w aplikacji ApplicationContext. –

+2

java_geek: To nie jest na tym interfejsie, jest na implementacji: 'ClassPathXmlApplicationContext' – skaffman

+0

nawet classpathxmlapplicationcontext nie ma metody close. –

21

To może być za późno na PO, ale jeśli ktoś nadal szuka dla niego ...

Bliskie metoda jest w AbstractApplicationContext i nie ApplicationContext, również innym sposobem jest użycie ctx.registerShutdownHook()instead of ctx.close() z oczywistych powodów, podczas pracy Junit s możesz zamknąć kontekst, ale nie w środowisku produkcyjnym, więc pozwól wiosce zdecydować, kiedy go zamknąć.

+1

+1 To powinno być zaakceptowaną odpowiedzią. –

+1

+ 1. Sprawdź to: http://www.tutorialspoint.com/spring/spring_bean_life_cycle.htm –

+0

Czy istnieje sposób, aby zamknąć go automatycznie przez timeout. Powiedzmy, że przez tydzień utrzymywałem swoją aplikację na moim serwerze bezczynnie. Czy to się kiedyś zamknie? Czy metoda destrukcji zostanie wywołana w tym czasie? – vsriram92

5
//Getting application context 
ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 

//cleaning context 
((ClassPathXmlApplicationContext) context).close(); 
+0

W ten sposób działa. – Gondy

1

hi trzeba zmienić ApplicationContext do AbstractApplicationContext a następnie zarejestrować się do ShutDownhook która zniszczy swoją fasolkę, a także realizacji DisposableBean np interfejs:

package spring.test; 

    import org.springframework.context.ApplicationContext; 
    import org.springframework.context.support.ClassPathXmlApplicationContext; 
    import org.springframework.context.support.AbstractApplicationContext; 
    public class InitTest { 
    public static void main(String[] args) { 
     AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("InitTestContext.xml"); 
    ctx.registerShutdownHook(); 
     InitTestBean bean = (InitTestBean)ctx.getBean("InitTestBean"); 
     bean.display(); 
    } 
    } 

i teraz implemnt się DisposableBean interfejs

package spring.test; 
import org.springframework.beans.factory.DisposableBean; 
    public class InitTestBean implements DisposableBean{ 
    private String prop1; 
    private String prop2; 
    public InitTestBean(String prop1, String prop2) { 
     System.out.println("Instantiating InitTestBean"); 
     this.prop1 = prop1; 
     this.prop2 = prop2; 
    } 
    public void setProp1(String prop1) { 
     System.out.println("In setProp1"); 
     this.prop1 = prop1; 
    } 
    public void setProp2(String prop2) { 
     System.out.println("In setProp2"); 
     this.prop2 = prop2; 
    } 
    public String getProp1() { 
     return prop1; 
    } 
    public String getProp2() { 
     return prop2; 
    } 
    public void display() { 
     System.out.println("Prop1 is " + prop1); 
     System.out.println("Prop2 is " + prop2); 
    } 
    public void initialize(){ 
     System.out.println("In initialize"); 
     this.prop1 = "init-prop1"; 
     this.prop2 = "init-prop2"; 
    } 
    public void teardown() { 
     System.out.println("In teardown"); 
     this.prop1 = null; 
     this.prop2 = null; 
    } 
    @Override 
    public void destroy() throws Exception { 

     System.out.println(" the bean has been destroyed"); 
    } 
    } 
1

factory.destroySingletons(); po bean.display() jako destroy-method jest v alued w definicji fasoli. Domyślny zakres, w którym tworzony jest komponent bean, jest zatem pojedynczy, dlatego wywołanie metody factory.destroySingletons() wywoła metodę wymienioną w destroy-method.

+0

Czy możesz dodać więcej szczegółów lub wyjaśnienia? Twoja obecna odpowiedź jest tak rzadka, że ​​prawdopodobnie zostanie usunięta. –

3

„Metoda zniszczyć-” jest wywoływana tylko wtedy i tylko wtedy, gdy fasola jest pojedyncza instancja

Zobacz wyjście dziennika kontenera IOC

INFO: Niszczenie singletons w org.springframework. [email protected]: definiowanie fasoli [book1]; root z hierarchii fabrycznej

+0

To była dla mnie prawdziwa odpowiedź. Próbowałem zrozumieć, dlaczego 'close' i' registerShutdownHook' nie działają. –