it-swarm.com.de

wann wird eine Spring-Beans-Methode aufgerufen?

Ich habe eine sysout-Anweisung in die "destroy-Methode" für eine Bean gesetzt. Wenn ich einen Beispielcode starte, wird der Sysout nicht ausgegeben. Bedeutet das, dass die Zerstörungsmethode nicht aufgerufen wird?

Die Testklasse:

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

Die Bohne

  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;
    }
  }

Die Config-Datei:

<?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>
21
java_geek

Ihr Beispiel funktioniert nicht, weil Sie den App-Kontext nicht schließen, sondern das Programm beenden lassen.

Rufen Sie close() im Kontext auf, und Sie werden sehen, dass die bean-destroy-Methoden aufgerufen werden.

29
skaffman

Es ist vielleicht zu spät für die OP, aber wenn noch jemand danach sucht ...

Die close-Methode befindet sich in AbstractApplicationContext und nicht in ApplicationContext. Eine andere Möglichkeit ist die Verwendung von ctx.registerShutdownHook()instead of ctx.close() aus offensichtlichen Gründen. Wenn Sie Junits ausführen, möchten Sie möglicherweise den Kontext schließen, jedoch nicht in der Produktionsumgebung.

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

//cleaning context
((ClassPathXmlApplicationContext) context).close(); 
4
Doc Immortal

Die "destroy-Methode" wird nur dann aufgerufen, wenn das Bean eine Singleton-Instanz ist

Siehe Protokollausgabe des Containers IOC

INFO: Singletons zerstören in org.s[email protected]1a0ce4c: Definieren von Beans [book1]; Wurzel der Fabrikhierarchie

3

hallo, Sie müssen ApplicationContext in AbstractApplicationContext ändern und sich dann bei einer ShutDownhook registrieren, die Ihre Bean zerstören und auch die DisposableBean-Schnittstelle implementieren wird. 

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

und implementieren Sie jetzt die DisposableBean-Schnittstelle 

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();, nachdem Ihre bean.display() als destroy-method in der Bean-Definition bewertet wurde. Der Standardbereich, mit dem die Bean erstellt wird, ist Singleton. Wenn Sie factory.destroySingletons() aufrufen, wird die in destroy-method angegebene Methode aufgerufen.

1
dev