需求
在创建bean对象后,调用一个初始化方法完成bean的初始化工作。
在Spring正常销毁前,调用一个结束/销毁方法做一些清理工作。
配置<bean>的init-method和destroy-method属性
· 默认情况下,在对应属性下,分别配置初始化方法名和结束方法名即可。
BeanObject
public class BeanObject implements IBeanObject {
public BeanObject(){
System.out.println("new BeanObject");
}
public void init(){
System.out.println("beanObject init ...");
}
public void close(){
System.out.println("beanObject close ...");
}
}
配置文件
<bean id="beanObject" class="com.hanaii.init_close.BeanObject"
init-method="init" destroy-method="close"/>
测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class InitCloseTest {
@Autowired
private ApplicationContext ctx;
@Test
public void test(){
BeanObject bean = ctx.getBean("beanObject", BeanObject.class);
}
}
测试结果
· bean对象为原型模式时,Spring不会调用结束方法
配置文件
<bean id="beanObject" class="com.hanaii.init_close.BeanObject" scope="prototype"
init-method="init" destroy-method="close"/>
测试结果
补充:bean对象为原型模式时,在手动启动时,即使正确关闭了容器,也不会调用结束方法。
· 手动启动容器时,必须要正常关闭Spring,Spring才能调用结束方法。
容器类型为:AbstractApplicationContext
通过调用容器对象的registerShutdownHook方法,在JVM的正常关闭线程中,添加一个Spring的关闭子线程。
只要JVM正常关闭,Spring就可正常关闭。
(可阅读该方法源代码,了解守护进程。)
测试代码
public class InitCloseTest {
@Test
public void test(){
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext
("com/hanaii/init_close/InitCloseTest-context.xml");
BeanObject bean = ctx.getBean("beanObject", BeanObject.class);
ctx.registerShutdownHook();
}
}
测试结果