Когда называется метод разрушения весенних бобов?

StackOverflow https://stackoverflow.com/questions/4460384

Вопрос

Я поместил в «Метод уничтожения» для бобов. Когда я запускаю пример кода, SYSOUT не получает вывод. Значит ли это, что метод уничтожения не вызывается?

Тестовый класс:

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

Боб

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

Файл конфигурации:

<?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>
Это было полезно?

Решение

Ваш пример не работает, потому что вы не выключаете AppContext, вы просто позволяете программе прекратить.

Вызов close() В контексте, и вы увидите, как называются методы уничтожения бобов.

Другие советы

Возможно, для ОП, но если кто -то все еще ищет ...

Близкий метод находится в AbstractApplicationContext и не ApplicationContext, также другой способ - использовать ctx.registerShutdownHook() instead of ctx.close() По понятным причинам, которые во время бега JunitВы можете захотеть закрыть контекст, но не в производственной среде, поэтому пусть Spring решает, когда его закрыть.

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

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

«Метод уничтожения» называется только тогда, если и только тогда, когда бон является экземпляром Синглтона

См. Вывод журнала контейнера IOC

ИНФОРМАЦИЯ: Уничтожение одиноких in org.springframework.beans.factory.support.defaultlistablebeanfactory@1a0ce4c: определение бобов [book1]; корень фабричной иерархии

Привет, тебе нужно изменить ApplicationContext к AbstractApplicationContext а затем зарегистрируйтесь в ShutDownhook который разрушит ваш боб, а также будет реализовать одноразовый интерфейс, например:

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

и теперь внедряет единого интерфейса

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

factory.destroySingletons(); после вашего bean.display() в качестве destroy-method ценится в определении бобов. Область по умолчанию, с которой создается фасоль, является синглтоном, следовательно, вызывая factory.destroySingletons() назовут метод, упомянутый в destroy-method.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top