首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Spring教程五】Spring框架大揭秘:一步步带你深入理解Bean的生命周期

  • 24-03-05 07:20
  • 2617
  • 10167
blog.csdn.net

目录

  • 1 环境准备
  • 2 生命周期设置
  • 3 close关闭容器
  • 4 注册钩子关闭容器
  • 5 bean生命周期小结

欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 IOC之Bean实例化方式》。

在这里插入图片描述
关于bean的相关知识还有最后一个是bean的生命周期,对于生命周期,我们主要围绕着bean生命周期控
制来讲解:

  • 首先理解下什么是生命周期?
    • 从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。
  • bean生命周期是什么?
    • bean对象从创建到销毁的整体过程。
  • bean生命周期控制是什么?
    • 在bean创建后到销毁前做一些事情。

现在我们面临的问题是如何在bean的创建之后和销毁之前把我们需要添加的内容添加进去

1 环境准备

还是老规矩,为了方便大家后期代码的阅读,我们重新搭建下环境:

  • 创建一个Maven项目
  • pom.xml添加依赖
  • resources下添加spring的配置文件applicationContext.xml
    这些步骤和前面的都一致,大家可以快速的拷贝即可,最终项目的结构如下:
    在这里插入图片描述
    (1)项目中添加BookDao、BookDaoImpl、BookService和BookServiceImpl类
public interface BookDao {
	public void save();
	}
	public class BookDaoImpl implements BookDao {
		public void save() {
			System.out.println("book dao save ...");
		}
	}
	public interface BookService {
		public void save();
	}
	public class BookServiceImpl implements BookService{
		private BookDao bookDao;
		public void setBookDao(BookDao bookDao) {
		this.bookDao = bookDao;
	}
	public void save() {
		System.out.println("book service save ...");
		bookDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

(2)resources下提供spring的配置文件


<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
beans>
  • 1
  • 2
  • 3
  • 4

(3)编写AppForLifeCycle运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class AppForLifeCycle {
	public static void main( String[] args ) {
		ApplicationContext ctx = new
		ClassPathXmlApplicationContext("applicationContext.xml");
		BookDao bookDao = (BookDao) ctx.getBean("bookDao");
		bookDao.save();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2 生命周期设置

接下来,在上面这个环境中来为BookDao添加生命周期的控制方法,具体的控制有两个阶段:

  • bean创建之后,想要添加内容,比如用来初始化需要用到资源
  • bean销毁之前,想要添加内容,比如用来释放用到的资源

步骤1:添加初始化和销毁方法
针对这两个阶段,我们在BooDaoImpl类中分别添加两个方法,方法名任意

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...");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

步骤2:配置生命周期
在配置文件添加配置,如下:

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init"
destroy-method="destory"/>
  • 1
  • 2

步骤3:运行程序
运行AppForLifeCycle打印结果为:
在这里插入图片描述
从结果中可以看出,init方法执行了,但是destroy方法却未执行,这是为什么呢?

  • Spring的IOC容器是运行在JVM中
  • 运行main方法后,JVM启动,Spring加载配置文件生成IOC容器,从容器获取bean对象,然后调方法执行
  • main方法执行完后,JVM退出,这个时候IOC容器中的bean还没有来得及销毁就已经结束了
  • 所以没有调用对应的destroy方法
    知道了出现问题的原因,具体该如何解决呢?

3 close关闭容器

  • ApplicationContext中没有close方法
  • 需要将ApplicationContext更换成ClassPathXmlApplicationContext
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  • 1
  • 调用ctx的close()方法
ctx.close();
  • 1
  • 运行程序,就能执行destroy方法的内容
    在这里插入图片描述

4 注册钩子关闭容器

  • 在容器未关闭之前,提前设置好回调函数,让JVM在退出之前回调此函数来关闭容器
  • 调用ctx的registerShutdownHook()方法
ctx.registerShutdownHook();
  • 1

注意:registerShutdownHook在ApplicationContext中也没有

  • 运行后,查询打印结果
    在这里插入图片描述
    两种方式介绍完后,close和registerShutdownHook选哪个?
    相同点:这两种都能用来关闭容器
    不同点:close()是在调用的时候关闭,registerShutdownHook()是在JVM退出前调用关闭。
    分析上面的实现过程,会发现添加初始化和销毁方法,即需要编码也需要配置,实现起来步骤比较多也比较乱。
    Spring提供了两个接口来完成生命周期的控制,好处是可以不用再进行配置init-method和destroy-method
    接下来在BookServiceImpl完成这两个接口的使用:
    修改BookServiceImpl类,添加两个接口InitializingBean, DisposableBean并实现接口中的两个方法afterPropertiesSet和destroy
public class BookServiceImpl implements BookService, InitializingBean,DisposableBean {
	private BookDao bookDao;
	public void setBookDao(BookDao bookDao) {
		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");
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

重新运行AppForLifeCycle类,
在这里插入图片描述
那第二种方式的实现,我们也介绍完了。
小细节

  • 对于InitializingBean接口中的afterPropertiesSet方法,翻译过来为属性设置之后。
  • 对于BookServiceImpl来说,bookDao是它的一个属性
  • setBookDao方法是Spring的IOC容器为其注入属性的方法
  • 思考:afterPropertiesSet和setBookDao谁先执行?
    • 从方法名分析,猜想应该是setBookDao方法先执行
    • 验证思路,在setBookDao方法中添加一句话
public void setBookDao(BookDao bookDao) {
 	System.out.println("set .....");
	this.bookDao = bookDao;
}
  • 1
  • 2
  • 3
  • 4

重新运行AppForLifeCycle,打印结果如下:
在这里插入图片描述
验证的结果和我们猜想的结果是一致的,所以初始化方法会在类中属性设置之后执行。

5 bean生命周期小结

(1)关于Spring中对bean生命周期控制提供了两种方式:

  • 在配置文件中的bean标签中添加init-method和destroy-method属性
  • 类实现InitializingBean与DisposableBean接口,这种方式了解下即可。

(2)对于bean的生命周期控制在bean的整个生命周期中所处的位置如下:

  • 初始化容器
    • 1.创建对象(内存分配)
    • 2.执行构造方法
    • 3.执行属性注入(set操作)
    • 4.执行bean初始化方法
  • 使用bean
    • 1.执行业务操作
  • 关闭/销毁容器
    • 1.执行bean销毁方法

(3)关闭容器的两种方式:

  • ConfigurableApplicationContext是ApplicationContext的子类
    • close()方法
    • registerShutdownHook()方法
源码获取~定制咨询~非开源
微信名片
注:本文转载自blog.csdn.net的老牛源码的文章"https://biyesheji365.blog.csdn.net/article/details/134745291"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top