[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.appcontext를 종료하지 않기 때문에 예제가 작동하지 않습니다. 프로그램을 종료시키는 것입니다.
appcontext를 종료하지 않기 때문에 예제가 작동하지 않습니다. 프로그램을 종료시키는 것입니다.
컨텍스트에서 close ()를 호출하면 호출되는 bean destroy-methods가 표시됩니다.
-
==============================
2.그것은 OP를 위해 너무 늦을지도 모르지만 누군가가 아직도 그것을 찾고 있다면 ...
그것은 OP를 위해 너무 늦을지도 모르지만 누군가가 아직도 그것을 찾고 있다면 ...
close 메소드는 ApplicationContext가 아닌 AbstractApplicationContext에 있고 또 다른 방법은 ctx.registerShutdownHook () 대신 ctx.close ()를 사용하여 Junit을 실행하는 동안 컨텍스트를 닫고 싶지만 프로덕션 환경에서는 그렇지 않은 것이 확실한 이유입니다. 봄은 언제 닫을 지 결정합니다.
-
==============================
3.
//Getting application context ApplicationContext context = new ClassPathXmlApplicationContext(beansXML); //cleaning context ((ClassPathXmlApplicationContext) context).close();
-
==============================
4."destroy-method"는 빈이 싱글 톤 인스턴스 인 경우에만 호출됩니다.
"destroy-method"는 빈이 싱글 톤 인스턴스 인 경우에만 호출됩니다.
IOC 컨테이너의 로그 출력보기
INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory@1a0ce4c에서의 싱글 톤 삭제 : 빈 정의 [book1]; 공장 계층의 루트
-
==============================
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.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에 언급 된 메소드가 호출됩니다.
from https://stackoverflow.com/questions/4460384/when-is-a-spring-beans-destroy-method-called by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 배치 @BeforeStep은 @StepScope와 작동하지 않습니다. (0) | 2019.01.01 |
---|---|
[SPRING] Spring @Async v 호출 가능 컨트롤러 (비동기 컨트롤러, 서블릿 3) (0) | 2019.01.01 |
[SPRING] 비 싱글 톤 빈에서 캐스팅 된 스프링 프록시에서 BeanNotOfRequiredTypeException 수정? (0) | 2019.01.01 |
[SPRING] 스프링 보안 - 이미 로그인 한 경우 리디렉션 (0) | 2019.01.01 |
[SPRING] 테스트 클래스가 더러워진 후에 Spring JUnit 애플리케이션 컨텍스트를 어떻게 재설정합니까? (0) | 2019.01.01 |