生命周期相关概念

  • 生命周期:从创建到消亡的完整过程。

  • bean生命周期:bean从创建到销毁的整体过程。

  • bean生命周期控制:在bean创建后到销毁前做一些事情。

代码演示

Bean生命周期控制

  • 提供生命周期控制方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
//表示bean初始化对应的操作
public void init(){
System.out.println("init...");
}
//表示bean销毁前对应的操作
public void destory(){
System.out.println("destory...");
}
}
  • applicationContext.xml配置:
1
2
3
<!--init-method:设置bean初始化生命周期回调函数,此处填写init方法名-->
<!--destroy-method:设置bean销毁生命周期回调函数,仅适用于单例对象,此处填写destory方法名-->
<bean id="bookDao" class="edu.heuet.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>
  • 测试类:
1
2
3
4
5
6
7
8
9
10
public class AppForLifeCycle {
public static void main( String[] args ) {
//此处需要使用实现类类型,接口类型没有close方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//关闭容器,执行销毁的方法
ctx.close();
}
}

Bean生命周期控制

  • 实现InitializingBean, DisposableBean接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
System.out.println("set .....");
this.bookDao = bookDao;
}
public void save() {
System.out.println("book service save ...");
bookDao.save();
}
public void destroy() throws Exception {
System.out.println("service destroy");
}
public void afterPropertiesSet() throws Exception {
System.out.println("service init");
}
}

测试类代码同上

Bean销毁时机

  • 容器关闭前触发bean的销毁。

  • 关闭容器方式:

    • 手工关闭容器:

      ConfigurableApplicationContext接口close()操作。

    • 注册关闭钩子,在虚拟机退出前先关闭容器再退出虚拟机:

      ConfigurableApplicationContext接口registerShutdownHook()操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class AppForLifeCycle {
public static void main( String[] args ) {
//此处需要使用实现类类型,接口类型没有close方法
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//注册关闭钩子函数,在虚拟机退出之前回调此函数,关闭容器
ctx.registerShutdownHook();
//关闭容器
//ctx.close();
}
}