SSM-Spring中bean的生命周期

发布于:2022-11-05 ⋅ 阅读:(369) ⋅ 点赞:(0)

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()方法进行初始化

  1. 总结
  • 生命周期流程
    • 创建对象,分配内存
    • 执行构造方法
    • 执行属性注入(set操作)
    • 执行bean的初始化操作
    • 使用bean执行业务操作
    • 执行bean销毁方法
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到