복붙노트

[SPRING] 언제 봄 콩 파괴 방법이라고?

SPRING

언제 봄 콩 파괴 방법이라고?

나는 bean을위한 "destroy-method"에 sysout 문을 넣었다. 샘플 코드를 실행하면 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>

해결법

  1. ==============================

    1.appcontext를 종료하지 않기 때문에 예제가 작동하지 않습니다. 프로그램을 종료시키는 것입니다.

    appcontext를 종료하지 않기 때문에 예제가 작동하지 않습니다. 프로그램을 종료시키는 것입니다.

    컨텍스트에서 close ()를 호출하면 호출되는 bean destroy-methods가 표시됩니다.

  2. ==============================

    2.그것은 OP를 위해 너무 늦을지도 모르지만 누군가가 아직도 그것을 찾고 있다면 ...

    그것은 OP를 위해 너무 늦을지도 모르지만 누군가가 아직도 그것을 찾고 있다면 ...

    close 메소드는 ApplicationContext가 아닌 AbstractApplicationContext에 있고 또 다른 방법은 ctx.registerShutdownHook () 대신 ctx.close ()를 사용하여 Junit을 실행하는 동안 컨텍스트를 닫고 싶지만 프로덕션 환경에서는 그렇지 않은 것이 확실한 이유입니다. 봄은 언제 닫을 지 결정합니다.

  3. ==============================

    3.

    //Getting application context
    ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); 
    
    //cleaning context
    ((ClassPathXmlApplicationContext) context).close(); 
    
  4. ==============================

    4."destroy-method"는 빈이 싱글 톤 인스턴스 인 경우에만 호출됩니다.

    "destroy-method"는 빈이 싱글 톤 인스턴스 인 경우에만 호출됩니다.

    IOC 컨테이너의 로그 출력보기

    INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory@1a0ce4c에서의 싱글 톤 삭제 : 빈 정의 [book1]; 공장 계층의 루트

  5. ==============================

    5.안녕하세요 당신은 ApplicationContext를 AbstractApplicationContext로 변경 한 다음 당신의 빈을 파괴하고 또한 DisposableBean 인터페이스를 구현하는 ShutDownhook에 등록 할 필요가 있습니다. 예 :

    안녕하세요 당신은 ApplicationContext를 AbstractApplicationContext로 변경 한 다음 당신의 빈을 파괴하고 또한 DisposableBean 인터페이스를 구현하는 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();
        }
      }
    

    이제 DisposableBean 인터페이스를 구현하십시오.

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

    6.factory.destroySingletons (); bean 정의에서 destroy-method가 가치가있는 것처럼 bean.display ()를 수행 한 후에. bean이 생성되는 기본 범위는 singleton이므로 factory.destroySingletons ()를 호출하면 destroy-method에 언급 된 메소드가 호출됩니다.

    factory.destroySingletons (); bean 정의에서 destroy-method가 가치가있는 것처럼 bean.display ()를 수행 한 후에. bean이 생성되는 기본 범위는 singleton이므로 factory.destroySingletons ()를 호출하면 destroy-method에 언급 된 메소드가 호출됩니다.

  7. from https://stackoverflow.com/questions/4460384/when-is-a-spring-beans-destroy-method-called by cc-by-sa and MIT license