jav*_*eek 22 java spring javabeans destroy
我在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();
}
}
Run Code Online (Sandbox Code Playgroud)
豆
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;
}
}
Run Code Online (Sandbox Code Playgroud)
配置文件:
<?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>
Run Code Online (Sandbox Code Playgroud)
ska*_*man 29
您的示例不起作用,因为您没有关闭appcontext,您只是让程序终止.
调用close()上下文,你会看到被调用的bean destroy方法.
小智 23
OP可能为时已晚,但如果有人还在寻找它......
close方法是in AbstractApplicationContext和not ApplicationContext,另一种方法是使用ctx.registerShutdownHook() instead of ctx.close()明显的原因,在运行Junits时你可能想要关闭上下文而不是在生产环境中,所以让Spring决定何时关闭它.
小智 7
当且仅当 bean 是单例实例时,才会调用“destroy-method”
查看IOC容器的日志输出
信息:销毁org.springframework.beans.factory.support.DefaultListableBeanFactory@1a0ce4c 中的单例:定义 beans [book1];工厂层次结构的根
小智 5
//Getting application context
ApplicationContext context = new ClassPathXmlApplicationContext(beansXML);
//cleaning context
((ClassPathXmlApplicationContext) context).close();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49762 次 |
| 最近记录: |