bean的生命周期
1.1 概念
1.2 具体控制
- 在BookDaoImpl实现类增加init和destroy的方法
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("destroy...");
}
}
- 配置文件增加属性
<bean id ="bookDao" class = "com.itheima.dao.impl.BookDaoImpl"
init-method="init" destroy-method="destory" />
- 结果
init...
book dao save
Process finished with exit code 0
1.3 关闭容器
没有出现destroy的方法,原因是因为虚拟机退出了
- 解决方法
在虚拟机退出前,把容器给关闭了,ClassPathXmlApplicationContext这个类的close方法进行关闭
public class App2 {
public static void main(String[] args) {
//3.获取IoC容器,ApplicationContext和配置一样,new一个接口实现类
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//4.获取bean,BookDao就是id
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
ctx.close();//ApplicationContext接口不具有这个方法,ctrl+h,使用ClassPathXmlApplicationContext
}
}
- 执行后看下结果
init...
book dao save
destroy...
1.4 关闭另一种解决方法
通过设置关闭钩子registerShutdownHook
public class App2 {
public static void main(String[] args) {
//3.获取IoC容器,ApplicationContext和配置一样,new一个接口实现类
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ctx.registerShutdownHook();//也是关掉虚拟机之前把他容器关闭
//4.获取bean,BookDao就是id
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//ctx.close();//ApplicationContext接口不具有这个方法,ctrl+h
}
}
1.5 bean的接口控制bean的生命周期
- 继承InitializingBean和DisposableBean,然后重写destroy()和afterPropertiesSet()
- 不需要配置文件再配置内容了
public class BookServiceImpl implements BookService, InitializingBean, DisposableBean {
//删除业务层中使用new的方式创建的dao对象
private BookDao bookDao;
public void save(){
System.out.println("book service save ...");
bookDao.save();
}
//生成set方法
public void setBookDao(BookDao bookDao) {
System.out.println("set ...");
this.bookDao = bookDao;
}
@Override
public void destroy() throws Exception {
System.out.println("service destroy");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("service init");
}
}
- App2类
public class App2 {
public static void main(String[] args) {
//3.获取IoC容器,ApplicationContext和配置一样,new一个接口实现类
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//4.获取bean,BookDao就是id
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
ctx.close();//ApplicationContext接口不具有这个方法,ctrl+h
}
}
service因为在配置文件中也被加载到bean对象中
- 结果
init...
set ...
service init
book dao save
service destroy
destroy...
set在service init之前表示通过set进行属性设置之后,才会运行afterPropertiesSet()方法进行初始化
- 总结
- 生命周期流程
- 创建对象,分配内存
- 执行构造方法
- 执行属性注入(set操作)
- 执行bean的初始化操作
- 使用bean执行业务操作
- 执行bean销毁方法
本文含有隐藏内容,请 开通VIP 后查看