Spring系列6:depends-on干预bean创建和销毁顺序
2022-01-26 08:20
666 查看
本文内容
- 不使用
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的初始化和销毁的影响和实际的应用场景。下一篇介绍自动依赖注入。
知识分享,转载请注明出处。学无先后,达者为先!
相关文章推荐
- Spring bean加载顺序 depends-on
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- SpringBoot系列教程之Bean之指定初始化顺序的若干姿势
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- Spring初始Bean时做操作的几个入口及多个bean的depends-on
- 【Spring】 (4)bean的 声明周期内创建初始化和销毁方法
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- SpringBoot系列教程之Bean加载顺序之错误使用姿势辟谣
- Spring4.3.x 容器中bean的创建过程(5)—— 注册bean的销毁方法
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- 在Spring容器中Bean的几种初始化、销毁方法的实现和先后顺序
- Spring系列第5篇:创建bean实例这些方式你们都知道?
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- SpringBoot系列教程之Bean之指定初始化顺序的若干姿势
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- Spring中Bean的depends-on属性
- Spring - bean的依赖关系(depends-on属性)