Spring 如何调用 Bean 的初始化方法和销毁方法?

手把手教你用DaVinci Configurator配置AUTOSAR SWC接口(含RTE避坑指南) 本文提供了一份基于DaVinci Configurator工具的AUTOSAR软件组件(SWC)接口配置实战指南。文章详细拆解了SR(发送者-接收者)和CS(客户端-服务器)接口的配置流程,并重点分享了运行时环境(RTE)生成阶段在多核部署、数据类型匹配等常见陷阱中的避坑方案与调试技巧,旨在帮助汽车电子工程师高效完成配置并规避错误。 阅读详情

Spring 提供了三种主要方式来指定和调用 Bean 的初始化方法和销毁方法:

1. 使用 @PostConstruct 和 @PreDestroy 注解 (JSR-250 注解):

  • @PostConstruct:

    • 标注在方法上,表示该方法是 Bean 的初始化方法。
    • Spring 容器会在 Bean 的所有属性设置完成后、InitializingBean.afterPropertiesSet 方法之前,调用 @PostConstruct 标注的方法。
    • 一个 Bean 可以有多个 @PostConstruct 方法,但它们的执行顺序是不确定的。
  • @PreDestroy:

    • 标注在方法上,表示该方法是 Bean 的销毁方法。
    • Spring 容器会在 Bean 被销毁之前、DisposableBean.destroy 方法之前,调用 @PreDestroy 标注的方法。
    • 一个 Bean 可以有多个 @PreDestroy 方法,但它们的执行顺序是不确定的。
  • 优点:

    • 简洁: 使用注解,代码更简洁、更易读。
    • 与 Spring 框架解耦: @PostConstruct 和 @PreDestroy 是 JSR-250 (Common Annotations for the Java Platform) 中的注解,不依赖于 Spring API。
  • 缺点:

    • 只能标注在方法上: 不能用于字段或其他地方。
    • 需要 Common Annotations API: 如果你的项目没有包含此 API, 则需要单独引入. 现代 Java EE 和 Jakarta EE 环境通常已经包含了。
  • 示例:

    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 初始化 (@PostConstruct)");
        }
    
        @PreDestroy
        public void cleanup() {
            System.out.println("MyBean 销毁 (@PreDestroy)");
        }
    }
    

2. 实现 InitializingBean 和 DisposableBean 接口 (Spring 接口):

  • InitializingBean:

    • 包含一个 afterPropertiesSet 方法。
    • Spring 容器会在 Bean 的所有属性设置完成后、@PostConstruct 方法之后,调用 afterPropertiesSet 方法。
  • DisposableBean:

    • 包含一个 destroy 方法。
    • Spring 容器会在 Bean 被销毁之前、@PreDestroy 方法之后,调用 destroy 方法。
  • 优点:

    • 明确: 通过接口明确了 Bean 的初始化和销毁行为。
  • 缺点:

    • 与 Spring 框架耦合: InitializingBean 和 DisposableBean 是 Spring 框架的接口。
    • 只能有一个初始化/销毁方法: 每个接口只能定义一个方法。
  • 示例:

    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyBean implements InitializingBean, DisposableBean {
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("MyBean 初始化 (InitializingBean.afterPropertiesSet)");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("MyBean 销毁 (DisposableBean.destroy)");
        }
    }
    

3. 使用 init-method 和 destroy-method 属性 (XML 配置):

  • init-method:

    • 在 XML 配置文件的 <bean> 标签中,使用 init-method 属性指定 Bean 的初始化方法。
    • Spring 容器会在 Bean 的所有属性设置完成后、InitializingBean.afterPropertiesSet 方法之后,调用 init-method 指定的方法。
  • destroy-method:

    • 在 XML 配置文件的 <bean> 标签中,使用 destroy-method 属性指定 Bean 的销毁方法。
    • Spring 容器会在 Bean 被销毁之前、DisposableBean.destroy 方法之后,调用 destroy-method 指定的方法。
  • 优点:

    • 与 Spring 框架解耦: 不需要实现 Spring 的接口或使用 Spring 的注解。
    • 可以在 XML 配置中集中管理: 方便查看和修改 Bean 的初始化和销毁方法。
  • 缺点:

    • 只能用于 XML 配置: 不能用于注解配置或 Java 配置。
    • 配置冗余: 需要在 XML 配置文件中指定方法名。
    • 类型不安全: 如果方法名拼写错误,Spring 在运行时才会报错。
  • 示例:

    <bean id="myBean" class="com.example.MyBean" init-method="myInit" destroy-method="myCleanup"/>
    
    public class MyBean {
    
        public void myInit() {
            System.out.println("MyBean 初始化 (init-method)");
        }
    
        public void myCleanup() {
            System.out.println("MyBean 销毁 (destroy-method)");
        }
    }
    

调用顺序:

对于同一个 Bean,如果同时使用了多种方式指定初始化或销毁方法,Spring 容器会按照以下顺序调用:

  • 初始化方法:

    1. @PostConstruct
    2. InitializingBean.afterPropertiesSet
    3. init-method
  • 销毁方法:

    1. @PreDestroy
    2. DisposableBean.destroy
    3. destroy-method

实践:

  • 优先使用 @PostConstruct 和 @PreDestroy 注解: 它们是 JSR-250 标准注解,与 Spring 框架解耦,代码更简洁。
  • 避免过度使用 InitializingBean 和 DisposableBean 接口: 它们会将你的代码与 Spring 框架耦合。
  • 谨慎使用 init-method 和 destroy-method 属性: 它们只能用于 XML 配置,并且存在类型不安全的问题。
  • 不要在同一个Bean中同时使用多种方式定义初始化/销毁方法。 这样做会使代码难以理解和维护。

总结:

Spring 提供了多种方式来指定和调用 Bean 的初始化方法和销毁方法,包括 @PostConstruct 和 @PreDestroy 注解、InitializingBean 和 DisposableBean 接口,以及 init-method 和 destroy-method 属性。 推荐优先使用 @PostConstruct 和 @PreDestroy 注解。

使用Google Earth Engine下载JRC全球水体数据 通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。 阅读详情

相关推荐

FastAPI + LLM 实战:5分钟搞定本地模型API服务部署(含避坑指南)

本文详细介绍了如何使用FastAPI和LLM(大语言模型)快速部署本地API服务,涵盖环境准备、模型集成、性能优化及避坑指南。通过实战示例,帮助开发者在5分钟内完成从零到生产的部署过程,提升AI应用开发效率。

weixin_29062963的博客 99

0108Bean销毁-Bean生命周期详解-spring

0108Bean销毁-Bean生命周期详解-spring

gaogzhen的博客 1115

手把手教你用Logisim搞定华科计组实验:单总线CPU硬布线控制器设计(含Excel自动生成电路技巧)

本文详细解析了如何使用Logisim完成华科计组实验中的单总线CPU硬布线控制器设计,特别分享了利用Excel自动生成电路逻辑的高效技巧。从实验准备、状态机表格填写到模块化构建和系统联调,提供全流程实战指导,帮助读者快速掌握计算机组成原理核心概念,大幅提升实验效率。

weixin_28744423的博客 321

Spring中bean的初始化和销毁几种实现方式详解

Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – ….– 销毁前操作 – 销毁方法的调用。 【1】init-method和destroy-method 两种方式,xml配置和注解。 ① xml配置: &amp;amp;amp;amp;lt;bean id=&amp;amp;amp;quot;person&amp;amp;amp;quot; class=&a

小小默:进无止境 2万+

图生文【学习中】

图生文:提供图像,把图像对应的信息用文本描述出来

qq_19072921的博客 1785

Android:Google三方库之Adjust集成详细步骤

Android为APP添加google adjust功能

学习就是我的个性 4472

Spring中Bean初始化和销毁的多种方式

详细介绍多种初始化Bean和销毁Bean的方式

初心不忘、始终方得 2476

【机器学习】推理时计算优化——思维链(Chain-of-Thought)与慢思考范式 第一章:基础理论与认知框架 第二章:计算优化技术与前沿方法

过程监督在数学推理中展现出显著优势,因其能够定位错误发生的具体步骤,而非仅在最终答案处提供稀疏反馈。然而,高质量过程标注的获取成本高昂,这催生了基于自动验证器的近似方法。

VectorShift的博客 71

【Spring源码系列】Bean生命周期-Bean销毁

Spring给我们提供了一种当的方式。那么,Spring底层到底是如何实现的呢?接下来,我们将从源码+案例的方式来解析:spring如何实现当bean销毁时调用某个方法的。当的时候(调用close())方法的时候,那么对于实现destroy方法的bean,就会开始执行各自自定义的销毁逻辑。提示: 是spring容器关闭的时候调用bean销毁逻辑,不是垃圾回收、程序意外终止、程序正常终止…的时候。1、。在‘初始化后’会对BeanDefinition进行判断,判断该BeanDefinition是否具备destr

qq_43783527的博客 4778

整车电检工艺流程

本文是笔者在从事汽车行业智能制造领域过程,对于整车电检工艺流程的理解与总结。

qq_40664711的博客 1万+

基于遗传算法改进BP神经网络的电池容量SOC预测

,遗传算法BP神经网络能很好的实现对电池容量soc的训练和预测,BP神经网络是一种成熟的神经,相对于其他神经网络,拥有很多的训练函数,传递函数,可以调节的参数非常多,对各种问题都可以达到一个比较理想的效果,关键看如何调试参数,选择训练传递函数,遗传算法改进BP神经网络的初始权值阈值,达到改进BP神经网络的目的,从而更好的实现对电池容量SOC的预测

abc991835105的博客 764

详解Spring的Bean销毁

一、注册Bean销毁逻辑 Bean的生命周期中,在完成了Bean的创建之后,会注册Bean销毁的逻辑 protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { …… registerDisposableBeanIfNecessary(beanName, bean, mbd); ……

sermonlizhi的博客 6149

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box

内部函数方式获取工序包容盒(最低点和最高点)PTHDSP_ask_box。

成长需要沉淀。 396

spring初始化bean和销毁bean时调用的方法

spring初始化bean和销毁bean时调用的方法   三种方法   1. 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 2. 通过 在xml中定义init-method 和  destory-method方法 3. 通过bean实现InitializingBean和 DisposableBean接口     三...

yjc0403的博客 699

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

spring bean初始化和销毁方法

spring bean初始化和销毁方法 转载于:https://www.cnblogs.com/westward/p/6923468.html

H405282968的博客 193

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

spring创建对象和销毁对象

调用初始化方法很容易,只要在xml文件中声明配置init-method属性,然后将方法名注入到里面即可,问题出在销毁方法用了很多方法都不能调用。 网上有很多方法回收销毁对象,比如将对象赋值为null,利用System.gc()方法强制回收等等。。 解决方案:将测试类中声明的ApplicationContext对象换成AbstractApplicationContext对象,配置destroy-method,将自己声明的方法注入到里面,然后调用reg...

qq_53344479的博客 752

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Spring 框架Bean的初始化和销毁 ---方式: @Bean(initMethod = “init“,destroyMethod = “destroy“)

Spring框架的Bean的初始化分为以下几种 谈bean必然要谈生命周期 Bean的生命周期 通常意义上讲的bean的名称周期,指的是bean从创建到初始化,经过一系列的流程,最终销毁的过程。只不过,在Spring中,bean的生命周期是由Spring容器来管理的。在Spring中,我们可以自己来指定bean的初始化和销毁的方法。当我们指定了bean的初始化和销 如何定义初始化和销毁方法? 我们已经知道了由Spring管理bean的生命周期时,我们可以指定bean的初始化和销毁方法,那具体.

LiZhen314的博客 5216

Spring注解驱动之@Bean注解指定初始化和销毁的方法

bean对象的生命周期

抽象的螺旋 986

[Spring手撸专栏学习笔记]——实现Bean对象的初始化和销毁方法

本文为Spring手撸专栏学习笔记,主要是debug调试记录

热爱编程的机械生的救赎 1550

Spring注解驱动开发第12讲——如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!

写在前面 在【Spring注解驱动开发专栏】中,前面的文章我们主要讲了有关于如何向Spring容器中注册bean的知识,大家可以到这一专栏中进行系统学习。 接下来,我们继续肝Spring,只不过从本篇文章开始,我们就进入Spring容器中有关bean的生命周期的学习。 bean的生命周期 通常意义上讲的bean的生命周期,指的是bean从创建到初始化,经过一系列的流程,最终销毁的过程。只不过,在Spring中,bean的生命周期是由Spring容器来管理的。在Spring中,我们可以自己来指定bean的初始

李阿昀的博客 4569

java bean初始化方法,Spring中bean的初始化和销毁几种实现方式详解

Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – …-- 销毁前操作 – 销毁方法的调用。【1】init-method和destroy-method自定义初始化方法和销毁方法两种方式:xml配置和注解。① xml配置class="com.core.Person" scope="singleton"init-metho...

weixin_31592801的博客 1217

【Spring系列】使用InitializingBean和DisposableBean来管理bean的生命周期

文章目录前言一、Bean 的生命周期一、InitializingBean 接口说明二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、Bean 的生命周期 通常意义上讲的bean的名称周期,指的是bean从创建到初始化,经过一系列的流程,最终销毁的过程。只不过,在Spring中,bean的生命周

陈皮的JavaLib 2741

spring注解-Bean的初始化和销毁和bean作用域

Bean的初始化和销毁 使用 @PostConstruct 注解, 标明初始化方法 —相当于 init-method 指定初始化方法 使用 @PreDestroy 注解, 标明销毁方法 ----相当于 destroy-method 指定对象销毁方法 示例: @Component("IifeCycleBean" ) public class LifeCycleBean { public Lif...

Denial_learn的博客 500

使用@Bean注解指定初始化和销毁的方法

使用@Bean注解指定初始化和销毁的方法

weixin_44230693的博客 927

Spring中Bean的加载到销毁(生命周期)

Spring对Bean的生命周期进行管理的过程 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其他Bean的引用 将Bean实例传递给后置处理器BeanPostProcessor的postProcessBeforeInitialization方法 调用 Bean的初始化方法 将Bean实例传递给后置处理器BeanPostProcessor的postProcessAfterIni...

chenyl 2722

Spring销毁Bean流程

通常来说,开发人员一般是不会定义Bean的销毁方法,但是作为一个开发,还是需要了解Bean的销毁过程

wuweuhai的博客 1390
上一篇: Nacos Server 的启动入口在哪里?启动参数有哪些?
下一篇: Nacos 的整体架构是什么样的?Client-Server 架构是如何体现的?
冰糖心书房
博客等级 码龄15年 6012粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值