深入理解Spring应用中的初始化和清理代码执行方式

目录

  1. 引言
  2. 使用@PostConstruct@PreDestroy注解
    • @PostConstruct
    • @PreDestroy
  3. 实现InitializingBeanDisposableBean接口
    • afterPropertiesSet()
    • destroy()
  4. 使用init-methoddestroy-method属性
    • init-method
    • destroy-method
  5. 使用@Bean注解的initMethoddestroyMethod属性
    • initMethod
    • destroyMethod
  6. 使用ApplicationListener接口
    • ContextRefreshedEvent
    • ContextClosedEvent
  7. 通过@EventListener注解处理生命周期事件
  8. 总结

引言

在Spring框架中,有多种方式可以实现初始化和清理代码的执行。每种方式都有其适用的场景和特点。本文将逐一介绍这些方式,详细解释其用法和注意事项。

使用@PostConstruct@PreDestroy注解

@PostConstruct

@PostConstruct注解用于标记在依赖注入完成后需要执行的方法。这个方法通常用于执行初始化操作。示例如下:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;@Component
public class MyBean {@PostConstructpublic void init() {// 初始化代码System.out.println("MyBean is initialized");}@PreDestroypublic void cleanup() {// 清理代码System.out.println("MyBean is cleaned up");}
}

@PreDestroy

@PreDestroy注解用于标记在Bean销毁前需要执行的方法。这个方法通常用于执行清理操作。

上述示例中的cleanup()方法即是通过@PreDestroy注解实现的,在Bean销毁前会被调用。

实现InitializingBeanDisposableBean接口

afterPropertiesSet()

实现InitializingBean接口并重写afterPropertiesSet()方法可以实现初始化逻辑。示例如下:

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;@Component
public class MyBean implements InitializingBean, DisposableBean {@Overridepublic void afterPropertiesSet() throws Exception {// 初始化代码System.out.println("MyBean is initialized");}@Overridepublic void destroy() throws Exception {// 清理代码System.out.println("MyBean is cleaned up");}
}

destroy()

实现DisposableBean接口并重写destroy()方法可以实现清理逻辑。上述示例中的destroy()方法即是通过实现DisposableBean接口实现的。

使用init-methoddestroy-method属性

在Spring配置文件中,可以通过init-methoddestroy-method属性指定初始化和清理方法。

init-method

以下是一个通过XML配置指定init-method的示例:

<bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="cleanup"/>

对应的Java类:

public class MyBean {public void init() {// 初始化代码System.out.println("MyBean is initialized");}public void cleanup() {// 清理代码System.out.println("MyBean is cleaned up");}
}

destroy-method

init-method类似,destroy-method用于指定Bean销毁前需要执行的方法。上述示例中的cleanup()方法即是通过XML配置的destroy-method属性实现的。

使用@Bean注解的initMethoddestroyMethod属性

initMethod

在Java配置类中,可以通过@Bean注解的initMethoddestroyMethod属性指定初始化和清理方法。示例如下:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Bean(initMethod = "init", destroyMethod = "cleanup")public MyBean myBean() {return new MyBean();}
}

destroyMethod

initMethod类似,destroyMethod用于指定Bean销毁前需要执行的方法。上述示例中的cleanup()方法即是通过@Bean注解的destroyMethod属性实现的。

使用ApplicationListener接口

ContextRefreshedEvent

实现ApplicationListener接口并监听ContextRefreshedEvent可以实现初始化逻辑。示例如下:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;@Component
public class ContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 初始化代码System.out.println("Context is refreshed");}
}

ContextClosedEvent

实现ApplicationListener接口并监听ContextClosedEvent可以实现清理逻辑。示例如下:

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;@Component
public class ContextClosedListener implements ApplicationListener<ContextClosedEvent> {@Overridepublic void onApplicationEvent(ContextClosedEvent event) {// 清理代码System.out.println("Context is closed");}
}

通过@EventListener注解处理生命周期事件

除了实现ApplicationListener接口外,还可以通过@EventListener注解处理Spring上下文的生命周期事件。

import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;@Component
public class LifecycleEventListener {@EventListenerpublic void handleContextRefreshed(ContextRefreshedEvent event) {// 初始化代码System.out.println("Context is refreshed");}@EventListenerpublic void handleContextClosed(ContextClosedEvent event) {// 清理代码System.out.println("Context is closed");}
}

总结

本文详细介绍了在Spring应用中执行初始化和清理代码的多种方式,包括使用@PostConstruct@PreDestroy注解、实现InitializingBeanDisposableBean接口、通过init-methoddestroy-method属性配置、使用@Bean注解的initMethoddestroyMethod属性、实现ApplicationListener接口以及通过@EventListener注解处理生命周期事件。每种方式都有其适用的场景和特点,开发者可以根据具体需求选择合适的方式来实现初始化和清理逻辑。

通过掌握这些技术,您可以更加灵活地控制Spring应用的生命周期管理,确保资源的合理使用和应用的稳定运行。如果您有任何问题或建议,欢迎在评论区留言讨论。

Happy Coding!

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

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

相关文章

【高级篇】第8章 Elasticsearch 安全与权限管理

在深入探讨Elasticsearch高级应用的征途中,我们无法忽视其核心——安全与权限管理的重要性。此章节将为你全面剖析如何构建一个既强大又安全的数据搜索与分析平台。本章内容将围绕X-Pack的强大功能展开,深入用户与角色管理的实践,以及如何利用SSL/TLS加密来强化数据传输的安…

如何使用C++调用Pytorch模型进行推理测试:使用libtorch库

如何使用C调用Pytorch模型进行推理测试&#xff1a;使用libtorch库 目录 如何使用C调用Pytorch模型进行推理测试&#xff1a;使用libtorch库一、环境准备1&#xff0c;linux&#xff1a;以ubuntu 22.04系统为例1. 准备CUDA和CUDNN2. 准备C环境3, 下载libtorch文件4, 编写测试li…

期权学习必看圣书:《3小时快学期权》要在哪里看?

今天带你了解期权学习必看圣书&#xff1a;《3小时快学期权》要在哪里看&#xff1f;《3小时快学期权》是一本关于股票期权基础知识的书籍。 它旨在通过简明、易懂的语言和实用的案例&#xff0c;让读者在短时间内掌握股票期权的基本概念、操作方法和投资策略。通过这本书&…

img的onload事件不触发

var img new Image(); img.src "图片地址" img.addEventListener(load, function() {// 加载完后的处理 }, false);上面的代码&#xff0c;可能存在设置addEventListener之前&#xff0c;图片已经加载完了&#xff0c;onload事件不处罚。 调换一下img.src和img.add…

Linux系统(CentOS)安装Mysql5.7.x

安装准备&#xff1a; Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址&#xff1a;https://blog.csdn.net/esqabc/article/details/140209894 1&#xff0c;下载mysql安装文件&#xff08;mysql-5.7.44为例&#xff09; 选择Linux通用版本64位&#xff08;L…

算力互联网网络架构;SRV6;智享WAN

目录 算力互联网网络架构 SRV6 主要特点 应用场景 结论 G-SRV6 多层次网络切片 智享WAN 一、定义与背景 二、关键技术 三、应用场景与优势 四、发展现状与未来展望 智能算力网络成为智能经济时代代表性数字基础设施 算力互联网网络架构 为构建算力互联网这个前瞻性…

SQLAlchemy配置连接多个数据库

1.定义配置项 首先定义两个数据库的配置信息 # PostgreSQL database configuration DB_USERNAMEpostgres DB_PASSWORDpassord DB_HOST127.0.0.1 DB_PORT5432 DB_DATABASEtest# mysql database configuration DB_USERNAME_MYSQLroot DB_PASSWORD_MYSQLpassword DB_HOST_MYSQL127…

后端之路——阿里云OSS云存储

一、何为阿里云OSS 全名叫“阿里云对象存储OSS”&#xff0c;就是云存储&#xff0c;前端发文件到服务器&#xff0c;服务器不用再存到本地磁盘&#xff0c;可以直接传给“阿里云OSS”&#xff0c;存在网上。 二、怎么用 大体逻辑&#xff1a; 细分的话就是&#xff1a; 1、准…

Rust: Fury高性能序列化库尝试

在序列化库中&#xff0c;传统的有Json,XML&#xff0c;性能好的有thrift&#xff0c;protobuf等。据说Fury官网的介绍&#xff0c;Fury性能要远远好于protobuf&#xff0c;且不象protobuf还需要定义IDL&#xff0c;非常轻便&#xff0c;随取随用。 今天来尝试一下。 一、carg…

gitlab每日备份以及restore

gitlab服务有非常简洁的每日备份命令&#xff0c; 从production的gitlab的每日备份中restore到backup环境也非常方便。 一、Production gitlab每日备份 1. Production gitlab环境上编写脚本 cat /root/gitlab_bak.shgitlab-rake gitlab:backup:create > /var/opt/gitl…

JavaSE (Java基础):面向对象(下)

8.7 多态 什么是多态&#xff1f; 即同一方法可以根据发送对象的不同而采用多种不同的方式。 一个对象的实际类型是确定的&#xff0c;但可以指向对象的引用的类型有很多。在句话我是这样理解的&#xff1a; 在实例中使用方法都是根据他最开始将类实例化最左边的类型来定的&…

消息中间件ApacheKafka在windows简单安装

一.背景 之前公司需要API网关管理软件ApacheShenYu&#xff0c;我相信把调用的记录都存到一个数据库。他支持日志推送到kafka&#xff0c;所以&#xff0c;我准备尝试一下通过kafka接收调用的日志信息。第一步&#xff0c;当然是安装kafka了。 二.ApacheKafka的下载 打开下载…

【C++】 解决 C++ 语言报错:Memory Leak

文章目录 引言 内存泄漏&#xff08;Memory Leak&#xff09;是 C 编程中常见且严重的内存管理问题之一。当程序分配了内存而没有正确释放&#xff0c;导致内存无法被重新利用时&#xff0c;就会发生内存泄漏。这种错误会导致程序占用越来越多的内存&#xff0c;最终可能导致系…

关于人情世故的小讨论

大家好&#xff0c;我是阿赵。   最近国内篮球界内出了不少事情&#xff0c;让人对篮球这项运动产生了很多疑问。   去年的CUBA&#xff0c;拥有全国最好生源的清华大学居然输给了连985 、211都不是的广东工业大学。作为广工的毕业生&#xff0c;我知道广工的篮球一直都很强…

Unity PC和Android端的数据存储和读取

使用Resource&#xff1a; 提示&#xff1a;使用resouce打包后会被压缩进.resources文件中&#xff0c;意味着它是只读文件&#xff0c;且必须使用resouce.load加载&#xff1a; /// <summary>/// 全平台使用/// </summary>/// <typeparam name"T"&g…

论文学习——动态多目标优化的一种新的分位数引导的对偶预测策略

论文题目&#xff1a;A novel quantile-guided dual prediction strategies for dynamic multi-objective optimization 动态多目标优化的一种新的分位数引导的对偶预测策略&#xff08;Hao Sun a,b, Anran Cao a,b, Ziyu Hu a,b, Xiaxia Li a,b, Zhiwei Zhao c&#xff09;In…

“免费”的可视化大屏案例分享-智慧园区综合管理平台

一.智慧园区是什么&#xff1f; 智慧园区是一种融合了新一代信息与通信技术的先进园区发展理念。它通过迅捷信息采集、高速信息传输、高度集中计算、智能事务处理和无所不在的服务提供能力&#xff0c;实现了园区内及时、互动、整合的信息感知、传递和处理。这样的园区旨在提高…

自定义注解-手机号验证注解

注解 package com.XX.assess.annotation;import com.XX.assess.util.MobileValidator;import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*;/*** 手机号校验注解* @author super*/ @Retention(RetentionPolicy.RUNTIME) @Ta…

正确使用Pytorch Geometric打开Cora(Planetoid)数据集

文章目录 关于报错&#xff08;"Cannot connect to host"&#xff09;解决方法 关于报错&#xff08;“Cannot connect to host”&#xff09; 我们在使用PyG调用Planetoid数据集的时候&#xff0c;常会碰到如下报错&#xff1a; 解决方法就是手动下载这个数据集。…

在 AWS Lambda 中使用 Flask 应用

本文将介绍如何在 AWS Lambda 中创建和部署一个使用 Flask 框架的应用。 1. 创建 Lambda 函数 首先,在 AWS Lambda 控制台创建一个新的函数,命名为 ​​flask-app​​。 2. 准备 Flask 层 为了在 Lambda 中使用 Flask,我们需要创建一个包含 Flask 库的层。按照以下步骤操…