深入理解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 {

    @PostConstruct
    public void init() {
        // 初始化代码
        System.out.println("MyBean is initialized");
    }

    @PreDestroy
    public 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 {

    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化代码
        System.out.println("MyBean is initialized");
    }

    @Override
    public 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> {

    @Override
    public 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> {

    @Override
    public 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 {

    @EventListener
    public void handleContextRefreshed(ContextRefreshedEvent event) {
        // 初始化代码
        System.out.println("Context is refreshed");
    }

    @EventListener
    public 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.mfbz.cn/a/774559.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

请查收!模拟电路精选书单一份(可下载)

在电子工程的广阔天地中&#xff0c;模拟电路设计是一门艺术&#xff0c;也是一种科学。它要求设计师不仅要有深厚的理论知识&#xff0c;还要有精湛的实践技能。随着技术的发展&#xff0c;模拟电路设计领域不断涌现新的理论、技术和工具&#xff0c;这使得学习和掌握模拟设计…

虚拟ECU:纯电动汽车发展下的新选择

人类文明的进步是一个不断自我否定、自我超越的过程。21世纪以来&#xff0c;随着科技进步和经济社会发展&#xff0c;能源和交通系统已从独立于自然环境的孤立系统&#xff0c;转变为与自然、技术、社会深度耦合的复杂系统。为实现可持续发展和应对气候变化&#xff0c;世界各…

JDBC 学习笔记+代码整理

Tip Idea自带可视界面&#x1f449;MySQL 图形化界面-CSDN博客 Idea2022无add Framework support选项&#x1f449;最新版IDEA:Add web Framework Support步骤/构建JavaWeb项目步骤_idea add framework support-CSDN博客 基本步骤 1.加载驱动包Driver 2.建立与数据库的连接C…

MYSQL 设置主从同步

效果图 主数据库表数据 从数据库表数据 mysql 数据库配置:主数据库 设置主数据 my.cnf vim /etc/mysql/my.cnf 配置内容 [mysqld] server-id=1 log-bin=mysql-bin # 不需要同步的表 binlog-ignore-db=mysql binlog-ignore-db=sys binlog-ignore-db=performance_schema bi…

Spire.PDF for .NET【文档操作】演示:以特定的缩放比例/百分比打开 PDF 文件

有时&#xff0c;我们可能需要在显示 PDF 文件时更改缩放比例以满足我们的要求。在本文中&#xff0c;我们将演示如何使用 Spire.PDF for .NET 以特定的缩放比例/百分比&#xff08;例如默认值、100% 或任何其他所需的缩放比例&#xff09;打开 PDF 文件。 Spire.PDF for .NET…

TAPD项目管理软件无法与企业微信进行关联

TAPD一段时间未使用后&#xff0c;需要重新启动&#xff0c;此时会出现你的企业微信尚未与TAPD账号关联的提示 解决方案&#xff1a;找到TAPD应用&#xff0c;先删除应用&#xff0c;然后再解除禁用即可

基于python 的动态虚拟主机

将自己电脑上的Python脚本文件上传到虚拟机/var/www/cgi-bin/目录下 [rootlocalhost conf.d]# cd /var/www/cgi-bin/ [rootlocalhost cgi-bin]# rz -E rz waiting to receive.编辑vhost.conf配置文件 [rootlocalhost conf.d]# vim vhost.conf<virtualhost 192.168.209.140…

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

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

Docker-自定义镜像发布到DockerHub仓库、阿里云仓库

文章目录 推送镜像DockerHub仓库推送镜像阿里云仓库 更多相关内容可查看 推送镜像DockerHub仓库 在服务器中 使用 docker 登录命令 docker login -u 账户 #enter 后输入密码推送镜像到DockerHub docker push 镜像名:tag但个人不建议推送到DockHub上&#xff0c;毕竟不是咱自…

【Python机器学习】处理文本数据——停用词

删除没有信息量的单词有一种方法&#xff0c;就是舍弃那些出现次数太多以至于没有信息量的单词。 有两种主要方法&#xff1a; 1、使用特定语言的停用词&#xff08;stopword&#xff09;列表&#xff1b; 2、舍弃那些出现过于频繁的单词。 scikit-learn的feature_extracti…

gradle构建工具

setting.gradle // settings.gradle rootProject.name my-project // 指定根项目名称include subproject1, subproject2 // 指定子项目名称&#xff0c;可选jar包名称 方式一 jar {archiveBaseName my-application // 设置 JAR 文件的基本名称archiveVersion 1.0 // 设置…

阿里云RDS云数据库库表恢复操作

最近数据库中数据被人误删了,记录一下恢复操作方便以后发生时进行恢复. 1.打开控制台&#xff0c;进入云数据库实例. 2.进入实例后 &#xff0c;点击右侧的备份恢复&#xff0c;然后看一下备份时间点&#xff0c;中间这边都是阿里云自动备份的备份集&#xff0c;基本都是7天一备…

与Flat Ads相约ChinaJoy 2024,共探全球化增长

在当今全球数字化浪潮的推动下,游戏产业作为文化与技术融合的先锋,正以前所未有的速度跨越国界,开启全球化发展的新篇章。随着第二十一届ChinaJoy的临近,全球的目光再次聚焦于上海新国际博览中心,这里即将成为数字娱乐与科技创新碰撞与交融的璀璨舞台。 而在这场盛会上,Flat A…

Python酷库之旅-第三方库Pandas(004)

目录 一、用法精讲 5、pandas.DataFrame.to_csv函数 5-1、语法 5-2、参数 5-3、功能 5-4、返回值 5-5、说明 5-6、用法 5-6-1、代码示例 5-6-2、结果输出 6、pandas.read_fwf函数 6-1、语法 6-2、参数 6-3、功能 6-4、返回值 6-5、说明 6-6、用法 6-6-1、代码…

某积分商城任意金额支付漏洞分析利用及思考

扫码领取网安教程 大部分开发人员在开发时都会有一种思维惯性&#xff0c;传参处处有校验处处都可信&#xff0c;但这个等式并非恒成立 前言 这个漏洞是在工作中例行渗透测试的时候发现的&#xff0c;虽然前端做了防篡改措施&#xff0c;但这是很经典的没有后端校验导致的任意…

【CSAPP】-attacklab实验

目录 实验目的与要求 实验原理与内容 实验设备与软件环境 实验过程与结果&#xff08;可贴图&#xff09; 实验总结 实验目的与要求 1. 强化机器级表示、汇编语言、调试器和逆向工程等方面基础知识&#xff0c;并结合栈帧工作原理实现简单的栈溢出攻击&#xff0c;掌握其基…

sql注入问题批量处理

问题&#xff1a;SQL注入修改&#xff0c;历史代码全是${};无法修改的比如表名&#xff0c;列名&#xff0c;动态排序之类的不改&#xff0c;其他的都要修改完成 背景&#xff1a;新公司第一个任务就是SQL注入的修改&#xff0c;历史sql全部都是${},一个个调整不太合适只能批量…

ubuntu 安装说明

最近准备学习Linux&#xff0c;所以下载了最新的ubuntu server版本24.04&#xff0c;将安装步骤记录下来供参考。 1.安装 挂载光驱和iso文件&#xff0c;启动虚拟机。启动后&#xff0c;你会看到 GRUB 菜单上有两个选项&#xff1a; Try or Install Ubuntu Server 和 Test mem…

六西格玛培训公司:实战教学,让品质管理不再纸上谈兵!

在追求卓越与品质管理的征途上&#xff0c;六西格玛培训公司张驰咨询凭借其深厚的行业底蕴与前瞻性的战略眼光&#xff0c;成为了引领行业变革的重要力量。公司不仅深谙六西格玛精髓&#xff0c;更将这一先进的质量管理方法论转化为推动企业转型升级的强大动力&#xff0c;以“…

碳课堂|搞清楚碳足迹,只看这篇文章就够了

碳足迹管理是碳达峰碳中和的重要政策工具&#xff0c;2023年12月&#xff0c;国家发展改革委、工信部、国家市场监管总局、住房城乡建设部、交通运输部等部门联合印发《关于加快建立产品碳足迹管理体系的意见》&#xff0c;对产品碳足迹管理各项重点任务作出系统部署。 推动碳…