【Spring】05 生命周期之初始化回调

文章目录

      • 1. 回调是什么
      • 2. 初始化回调
        • 2.1 实现 InitializingBean 接口
        • 2.2 配置 init-method
      • 3. 执行顺序
      • 4.优势及应用
      • 总结

在 Spring 框架中,生命周期回调(Lifecycle Callbacks)是一种强大的机制,它允许我们在 Spring 容器中的 Bean 生命周期的不同阶段执行特定的操作。这为我们提供了一种灵活的方式来管理和控制 Bean 的生命周期。

1. 回调是什么

在 Spring 中,每个 Bean 都有一个生命周期,它从被创建到被销毁的过程中经历了不同的阶段。生命周期回调就是在这些阶段执行特定方法的机制。

Spring 提供了两种生命周期回调的方式:初始化回调和销毁回调。

在这里插入图片描述

发现它是不是有点像模版方法设计模式!

本节将介绍 初始化回调,下一节介绍 销毁回调。

2. 初始化回调

Spring 的初始化回调机制提供了一种在 Bean 实例化后,依赖注入之后执行特定逻辑的方式。这种机制带来了一些好处,使得开发者能够更灵活地管理和定制 Bean 的初始化过程。

接下来我们从以下两种方式来实现初始化回调

2.1 实现 InitializingBean 接口

1)配置 Bean

applicationContext.xml

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="springDemo" class="org.example.cheney.SpringDemo"><constructor-arg value="SpringDemo"/></bean>
</beans>

2)创建 Spring 并实现 InitializingBean

package org.example.cheney;import org.springframework.beans.factory.InitializingBean;public class SpringDemo implements InitializingBean {private String name;public SpringDemo(String name) {this.name = name;}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("Bean " + name + "初始化啦(By InitializingBean)");}
}

3)创建启动类

package org.example.cheney;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {String location = "applicationContext.xml";ApplicationContext context = new ClassPathXmlApplicationContext(location);}
}

输出结果:

在这里插入图片描述

2.2 配置 init-method

1)配置 Bean

applicationContext.xml

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="springDemo" class="org.example.cheney.SpringDemo" init-method="initMethod"><constructor-arg value="SpringDemo"/></bean>
</beans>

2)创建 Spring 并创建 initMethod()

package org.example.cheney;public class SpringDemo {private String name;public SpringDemo(String name) {this.name = name;}public void initMethod() {System.out.println("Bean " + name + "初始化啦(By init-method)");}
}

3)创建启动类

package org.example.cheney;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String[] args) {String location = "applicationContext.xml";ApplicationContext context = new ClassPathXmlApplicationContext(location);}
}

输出结果:

在这里插入图片描述

此处还可以设定 beans 层面的默认方法,如下图

在这里插入图片描述

3. 执行顺序

在 Spring 中,初始化回调的执行顺序是:实现 InitializingBean 接口的 afterPropertiesSet 方法 -> 配置 init-method 。

在这里插入图片描述

Spring的初始化回调机制提供了一种在Bean实例化后,依赖注入之后执行特定逻辑的方式。这种机制带来了一些好处,使得开发者能够更灵活地管理和定制Bean的初始化过程。

4.优势及应用

  • 统一的初始化逻辑: 通过实现 InitializingBean 接口或配置 init-method,可以将 Bean 的初始化逻辑集中在一个统一的位置,提高代码的可读性和维护性。
  • 依赖注入后的进一步处理: 在 Bean 的初始化回调中,你可以确保所有的依赖都已经注入完成,然后执行一些进一步的处理逻辑,例如资源的加载、状态的检查等。
  • 框架集成: 某些框架或库可能需要在应用程序启动时进行初始化,通过Spring 的初始化回调,你可以很方便地将这些框架或库的初始化逻辑集成到你的应用程序中。
  • 资源管理: 在初始化回调中执行资源的初始化,比如打开数据库连接、建立网络连接等,确保资源的正确获取和配置。
  • 灵活的配置方式: 你可以选择使用 XML 配置、Java 配置或注解方式来定义初始化回调,根据个人或团队的偏好来进行选择,提供了灵活性。
  • 与Spring生命周期其他阶段的配合: 初始化回调与 Spring 生命周期的其他阶段(例如 Bean 的销毁阶段)配合使用,使得整个 Bean 的生命周期管理更加完善。
  • 在初始化回调中抛出异常: 如果在初始化回调中发生异常,Spring 会捕获并将其转换为BeanInitializationException,从而阻止应用程序的正常启动,提高了对初始化过程的安全性。

总结

生命周期回调(Lifecycle Callbacks)是 Spring 框架中一个强大的特性,它为开发者提供了在 Bean 的生命周期不同阶段执行特定操作的灵活方式。通过初始化回调,我们能够更好地管理和控制应用程序中的组件。在实际开发中,合理使用生命周期回调可以提高应用程序的稳定性和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/277743.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十几个软件测试实战项目【外卖/医药/银行/电商/金融】

项目一&#xff1a;ShopNC商城 项目概况&#xff1a; ShopNC商城是一个电子商务B2C电商平台系统&#xff0c;功能强大&#xff0c;安全便捷。适合企业及个人快速构建个性化网上商城。 包含PCIOS客户端Adroid客户端微商城&#xff0c;系统PC后台是基于ThinkPHP MVC构架开发的跨…

焊盘:十字连接VS全覆盖 铺铜

在铺铜规则中&#xff0c;焊盘连接方式有两种&#xff1a; 十字连接 优点&#xff1a;较好焊接&#xff1a;因铺铜面积减少&#xff0c;温度下降速度降低&#xff0c;较好焊接&#xff0c;不易虚焊。 缺点&#xff1a;载流能力较弱&#xff1a;铺铜面积↓ → 载流能力↓全连接…

Flink 数据集类型

现实世界中&#xff0c;所有的数据都是以流式的形态产生的&#xff0c;不管是哪里产生的数据&#xff0c;在产生的过程中都是一条条地生成&#xff0c;最后经过了存储和转换处理&#xff0c;形成了各种类型的数据集。如下图所示&#xff0c;根据现实的数据产生方式和数据产生是…

面对同行恶意排挤,佳卫苗灭杀病毒HPV向市场发出灵魂五问

近期&#xff0c;抗HPV市场因为一款名叫“佳卫苗灭杀病毒HPV”的产品诞生而风起云涌。上市之初&#xff0c;产品方便表示&#xff0c;佳卫苗灭杀病毒HPV的诞生&#xff0c;不仅是为了造福患者&#xff0c;更是为了优化市场、刺激行业升级&#xff0c;以“机理更科学、材料更先进…

【开源软件】最好的开源软件-2023-第14名 Appsmith

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

GZ015 机器人系统集成应用技术样题2-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题2 选手须知&#xff1a; 本任务书共 25页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

java-IO流

File类 引入 【1】文件&#xff0c;目录&#xff1a; 文件&#xff1a; 内存中存放的数据在计算机关机后就会消失。要长久保存数据&#xff0c;就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索&#xff0c;引入了“文件”的概念。一篇文章、一段视频、一个可执…

【AutoDL】使用云服务器跑深度学习代码

一、AutoDL租用服务器 1.选用服务器 1.算力市场 租用服务器&#xff0c;选择自己心仪的服务器 2.镜像 可以选择一些基础的镜像&#xff0c;社区镜像里是git上有的环境。 3.上传文件 在文件存储中&#xff0c;选择上传的区&#xff0c;在右边点击上传&#xff0c;选择自己的文…

iClient3D 图元操作

1. S3MTilesLayer&#xff0c;S3M(Spatial 3D Model)图层类 S3MTilesLayer&#xff0c;S3M(Spatial 3D Model)图层类&#xff0c;通过该图层实现加载三维切片缓存&#xff0c;包括倾斜摄影模型、BIM模型、点云数据、精细模型、矢量数据、符号等。 那S3MTilesLayer中针对图元的…

美洽获评2023中国软件技术最佳AIGC应用奖,助力智能客服创新发展

12月15日&#xff0c;由中国科学院软件研究所、中科软科技股份有限公司联合主办的“2023中国软件技术大会”在北京举行。作为软件领域的年度盛事&#xff0c;“中国软件技术大会”已经成功举办20届。本次大会以“大模型驱动下的软件变革”为主题&#xff0c;聚焦于生成式AI等前…

死锁的预防、避免、检测和消除

一、预防死锁 1. 破坏互斥条件 2. 破坏不剥夺条件 3.破坏请求和保持条件 4.破坏循环等待条件 二、避免死锁 避免死锁的一种方法是使用银行家算法&#xff0c;它涉及到安全序列的概念。银行家算法是一种资源分配和死锁避免的算法&#xff0c;它确保系统能够分配资源而不会导致死…

坚持创新驱动,超卓航科入选为“新一批国家知识产权优势企业”!

近日&#xff0c;根据《国家知识产权局关于确定2023年新一批及通过复核的国家知识产权示范企业和优势企业的通知》精神&#xff0c;经湖北省知识产权局组织测评、推荐&#xff0c;国家知识产权局审核&#xff0c;超卓航科入选为“新一批国家知识产权优势企业”。 超卓航科以金属…