-
Spring系列6:depends-on干预bean创建和销毁顺序
本文内容
-
不使用
depends-on
bean的初始化和销毁顺序 -
使用
depends-on
后bean的初始化和销毁顺序 -
depends-on
结论和应用场景
结论先上
初始化: depends-on
属性可以显式地强制一个或多个 bean 在使用这个元素的 bean 被初始化之前被初始化。
销毁:depends-on
属性指定的那些依赖bean先销毁,使用这个元素的 bean后被销毁,干预了关闭顺序。
结论给完了,我们下面通过案例验证。
不使用depends-on
bean的初始化和销毁顺序
定义3个简单类,包含init
和destroy
方法,用于观察顺序
public class MyBeanA {
public void init() {
System.out.println("MyBeanA 被初始化-----");
}
public void destroy() {
System.out.println("MyBeanA 被销毁-----");
}
}
public class MyBeanB {
public void init() {
System.out.println("MyBeanB 被初始化-----");
}
public void destroy() {
System.out.println("MyBeanB 被销毁-----");
}
}
public class MyBeanC {
public void init() {
System.out.println("MyBeanC 被初始化-----");
}
public void destroy() {
System.out.println("MyBeanC 被销毁-----");
}
}
配置中bean定义并指定初始化方法和销毁方法
<?xml version="1.0" encoding="UTF-8"?>
<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 class="com.crab.spring.ioc.demo04.MyBeanA" init-method="init" destroy-method="destroy" id="myBeanA"/>
<bean class="com.crab.spring.ioc.demo04.MyBeanB" init-method="init" destroy-method="destroy" id="myBeanB"/>
<bean class="com.crab.spring.ioc.demo04.MyBeanC" init-method="init" destroy-method="destroy" id="myBeanC"/>
</beans>
测试容器对bean的初始化和销毁
package com.crab.spring.ioc.demo04;
/**
* @author zfd
* @version v1.0
* @date 2022/1/13 15:11
* @关于我 请关注公众号 螃蟹的Java笔记 获取更多技术系列
*/
public class Test {
@org.junit.Test
public void test() {
System.out.println("开始创建容器并初始化bean");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("demo04/spring1.xml");
System.out.println("开始关闭容器并销毁bean");
context.close();
}
}
本阶段结论
输出结果
开始创建容器并初始化bean
MyBeanA 被初始化-----
MyBeanB 被初始化-----
MyBeanC 被初始化-----
开始关闭容器并销毁bean
MyBeanC 被销毁-----
MyBeanB 被销毁-----
MyBeanA 被销毁-----
初始化的顺序是bean在配置文件中的配置顺序A-B-C
销毁的顺序与初始化顺序相反C-B-A
使用depends-on
后bean的初始化和销毁顺序
在上面案例的基础上,调整MyBeanA
的配置
<?xml version="1.0" encoding="UTF-8"?>
<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 class="com.crab.spring.ioc.demo04.MyBeanA" init-method="init" destroy-method="destroy" id="myBeanA" depends-on="myBeanC"/>
<bean class="com.crab.spring.ioc.demo04.MyBeanB" init-method="init" destroy-method="destroy" id="myBeanB"/>
<bean class="com.crab.spring.ioc.demo04.MyBeanC" init-method="init" destroy-method="destroy" id="myBeanC"/>
</beans>
测试程序一样,指定配置文件
@org.junit.Test
public void test2() {
System.out.println("开始创建容器并初始化bean");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("demo04/spring2.xml");
System.out.println("开始关闭容器并销毁bean");
context.close();
}
本阶段结论
运行结果
开始创建容器并初始化bean
MyBeanC 被初始化-----
MyBeanA 被初始化-----
MyBeanB 被初始化-----
开始关闭容器并销毁bean
MyBeanB 被销毁-----
MyBeanA 被销毁-----
MyBeanC 被销毁-----
初始化的顺序:C-A-B,不同地方A依赖于C,所以C先初始化,然后到A,顺序再到B
销毁的顺序:B-A-C,销毁A再销毁C
depends-on
结论和应用场景
干预初始化:例如当需要触发类中的静态初始化方法来注册数据库驱动程序时候,是依赖于数据库的配置bean先初始化的。
干预销毁:例如我们的清理类A中在销毁方法中保存进程中某些数据到redis,依赖于RedisTemplate
,则RedisTemplate
必须在A之后销毁。
总结
本文介绍各种介绍了depends-on
对bean的初始化和销毁的影响和实际的应用场景。下一篇介绍自动依赖注入。
本篇源码地址: https://github.com/kongxubihai/pdf-spring-series/tree/main/spring-series-ioc/src/main/java/com/crab/spring/ioc/demo04
出处:
https://www.cnblogs.com/kongbubihai/p/15845338.html
栏目列表
最新更新
Redis哨兵模式高可用解决方案
从 Map -> HashMap 的一步步实现,各位请随
JVM系列【1】虚拟机基础概念
Spring系列13:bean的生命周期
Spring系列9:基于注解的Spring容器配置
Spring系列8:bean的作用域
Spring系列7:`autowire`自动装配怎么玩
Spring系列6:depends-on干预bean创建和销毁顺
Spring系列5:各种属性值依赖注入
再见丑陋的 SwaggerUI,这款开源的API文档生
SQL分库分表
关于如何在window下执行SQLSERVER的定时备份
SQLServer高可用方案在企业生产环境的实践
SQL Server HA - 高可用性解决方案解决方案概
独家揭秘:SQL Server AlwaysOn在阿里云的突破
sqlserver数据库还原存储过程脚本
MongoDB常用命令(2)
MongoDB基本介绍与安装(1)
SQLServer触发器调用JavaWeb接口
SQL Server索引的原理深入解析
增删商品计算价格
【JavaScript】笔记(6)--- BOM(open 与 clo
【JavaScript】笔记(5)--- DOM(续)(复选
【JavaScript】笔记(4)--- DOM(初步)(获取文
PHP学生校园考勤管理系统,使用MYSQL数据库
重学正则-量词符和预定义类的使用
Kubernetes 生产部署实录 - 基于 sealos 部署
小程序商城网站开发秒杀模块篇
为了实践微前端,重构了自己的导航网站
DOM