Spring中初始化bean和销毁bean的时候执行某个方法的详解

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题 阅读详情


第一种:通过注解@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作


  1. import javax.annotation.PostConstruct;    
  2. import javax.annotation.PreDestroy;    
  3.   
  4. public class DataInitializer{     
  5.     @PostConstruct  
  6.     public void initMethod() throws Exception {  
  7.         System.out.println("initMethod 被执行");  
  8.     }  
  9.     @PreDestroy  
  10.     public void destroyMethod() throws Exception {  
  11.         System.out.println("destroyMethod 被执行");  
  12.     }  
  13. }  

第二种是:通过 在xml中定义init-method 和  destory-method方法

  1. public class DataInitializer{  
  2.     public void initMethod() throws Exception {  
  3.         System.out.println("initMethod 被执行");  
  4.     }  
  5.     public void destroyMethod() throws Exception {  
  6.         System.out.println("destroyMethod 被执行");  
  7.     }  
  8. }  

  1. <bean id="dataInitializer" class="com.somnus.demo.DataInitializer" init-method="initMethod" destory-method="destroyMethod"/>  

第三种是: 通过bean实现InitializingBean和 DisposableBean接口

  1. import org.springframework.beans.factory.DisposableBean;  
  2.   
  3. public class DataInitializer implements InitializingBean,DisposableBean{  
  4.       
  5.     @Override  
  6.     public void afterPropertiesSet() throws Exception {  
  7.         System.out.println("afterPropertiesSet 被执行");  
  8.     }  
  9.       
  10.     @Override  
  11.     public void destroy() throws Exception {  
  12.         System.out.println("destroy 被执行");  
  13.     }  
  14.   
  15. }  

其中第一种和第二种是同一种形式,只不过一种xml配置,另外一种采用注解形式罢了,有很大区别的是第三种,

如果同一个bean同时采用两种方式初始化的时候执行某个方法,首先在执行顺序上就会体现出来。

先执行afterPropertiesSet(),

后执行initMethod()


这里我们看下源码

这方式在spring中是怎么实现的?

通过查看spring的加载bean的源码类(AbstractAutowireCapableBeanFactory)可看出其中奥妙

AbstractAutowireCapableBeanFactory类中的invokeInitMethods讲解的非常清楚,源码如下:

  1. protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)  
  2.       throws Throwable {  
  3.   //判断该bean是否实现了实现了InitializingBean接口,如果实现了InitializingBean接口,则只掉调用bean的afterPropertiesSet方法  
  4.   boolean isInitializingBean = (bean instanceof InitializingBean);  
  5.   if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {  
  6.       if (logger.isDebugEnabled()) {  
  7.           logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");  
  8.       }  
  9.         
  10.       if (System.getSecurityManager() != null) {  
  11.           try {  
  12.               AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {  
  13.                   public Object run() throws Exception {  
  14.                       //直接调用afterPropertiesSet  
  15.                       ((InitializingBean) bean).afterPropertiesSet();  
  16.                       return null;  
  17.                   }  
  18.               },getAccessControlContext());  
  19.           } catch (PrivilegedActionException pae) {  
  20.               throw pae.getException();  
  21.           }  
  22.       }                  
  23.       else {  
  24.           //直接调用afterPropertiesSet  
  25.           ((InitializingBean) bean).afterPropertiesSet();  
  26.       }  
  27.   }  
  28.   if (mbd != null) {  
  29.       String initMethodName = mbd.getInitMethodName();  
  30.       //判断是否指定了init-method方法,如果指定了init-method方法,则再调用制定的init-method  
  31.       if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&  
  32.               !mbd.isExternallyManagedInitMethod(initMethodName)) {  
  33.               //进一步查看该方法的源码,可以发现init-method方法中指定的方法是通过反射实现  
  34.           invokeCustomInitMethod(beanName, bean, mbd);  
  35.       }  
  36.   }  

总结:

1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过

init-method指定,两种方式可以同时使用


2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是

init-method方式消除了对spring的依赖


3:如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。


【大模型】百度千帆大模型对接LangChain使用详解 百度千帆大模型对接LangChain使用详解 阅读详情

相关推荐

脑机接口(BCI)从原理到开发实战 01|意念控制真的来了?一文看懂脑机接口的技术革命

类型定义典型应用主动式用户主动产生特定思维模式来控制设备运动想象(想象左手/右手移动)反应式用户被动接受外部刺激,系统检测大脑反应P300拼写器、SSVEP(稳态视觉诱发电位)被动式系统监测用户自发脑状态,不要求主动控制疲劳监测、情绪识别、注意力评估本系列后续文章将重点围绕主动式(运动想象)和反应式(P300/SSVEP)展开实战。脑机接口,这个曾经只存在于科幻中的概念,正在政策、资本、技术的三重驱动下,加速从实验室走向产业落地。2026年,注定是脑机接口发展史上浓墨重彩的一年。

小明的博客 1425

在web容器启动和停止容器的时候执行自定义类中的方法

在项目中遇到一个需求。需要用到自定的类,没有@Resource等注解。但是需要web容器启动的时候,执行该类中的方法。笔者自己打了个spring+springMVC的架子后测试以及在项目中测试成功。 具体实现如下: 自定义的类实现InitializingBean import org.springframework.beans.factory.InitializingBean; public class AutoStart implements InitializingBean{ @Overrid

hstjbj的博客 280

lvds接口_LVDS,接口,时序讲解,非常好的文章

欢迎FPGA工程师加入官方微信技术群点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群1.1.1 LVDS接口分类1.1.1.1 单路6bit LVDS这种接口电路中,采用单路方式传输,每个基色信号采用6位数据,共18位RGB数据,因此,也称18位或18bit LVDS接口。此,也称18位或18bit LVDS接口。1.1.1.2 双路6bit LVDS这种接口电...

weixin_39639286的博客 1901

Spring Bean初始化之后/销毁之前执行指定方法

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 通过 在xml中定义init-method 和  destory-method方法 通过bean实现InitializingBean和 DisposableBean接口 下面举例: Spring注解方式 ...

weixin_38399962的博客 3261

深入解析ISO12233标准:SFR算法从理论到代码实现

本文深入解析ISO12233标准中的SFR算法,从理论到代码实现全面介绍如何量化成像系统的解析力。通过e-SFR算法测量边缘扩散函数(ESF)和空间频率响应(SFR),结合光学原理和实际代码示例,帮助开发者准确评估影像质量。文章包含关键步骤的Python实现和工程优化技巧,适用于相机测试、镜头评估等应用场景。

weixin_29200485的博客 153

cadence Virtuoso ADE原理图库中的VCVS(压控电压源)使用

Symbol: vcvs (Voltage Controlled Voltage Source) Vop−Von=egain⋅(Vip−Vin)V_{op}-V_{on}=egain\cdot(V_{ip}-V_{in})Vop​−Von​=egain⋅(Vip​−Vin​) 所以可以得出 ⟹Vop=egain⋅(Vip−Vin)+Von\Longrightarrow V_{op}=egain\cdot(V_{ip}-V_{in})+V_{on}⟹Vop​=egain⋅(Vip​−Vin​)+Von​ 使

大学生视野 2万+

spring boot如何在所有bean初始化之前加载一个自定义类?

问题一spring boot如何在所有bean初始化之前加载一个自定义类?方案首先创建一个class,继承ApplicationContextInitializer接口,并实现方法initialize,如下,MyServicepackage com.eju.ess.controller;import org.springframework.context.ApplicationContextInit

MiniCTO 1万+

使用mmdetection快速复现计算机视觉顶会论文

使用mmdetection中支持的算法运行自定义数据集

m0_56896669的博客 2419

Spring生命周期-InitializingBean,DisposableBean

IOC容器的组件除通过声明自定义初始化和销毁方法外,可以实现InitializingBean接口和DisposableBean接口,在实现内中完成初始化和销毁的逻辑; InitializingBean的接口定义如下: package org.springframework.beans.factory; public interface InitializingBean { /** ...

luojinbai的专栏 1267

开关电源设计实战:如何用AP值快速选型磁芯(附计算公式推导)

本文为开关电源工程师提供了基于AP值的磁芯快速选型实战指南。文章深入解析了AP值作为磁芯‘功率吞吐量’指标的核心物理意义,并通过详细的公式推导和24W反激电源设计实例,手把手演示如何利用AP值计算公式,结合电流密度、窗口利用率等关键参数,从众多磁芯型号中高效筛选出合适型号,同时强调了选型后的关键校验步骤与常见误区。

weixin_29234239的博客 865

【汇编实战开发笔记】一段汇编代码如何“反编译”成C代码?

介绍了一种由汇编代码得到C代码的方法

一个专注于嵌入式IoT领域的架构师,深耕IoT领域多年,深度掌握IoT领域的相关技术栈,包括但不限于RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、嵌入式IoT系统的架构设计等。 1万+

小记--InitializingBean子类afterPropertiesSet()方法不执行

InitializingBean与Spring 懒加载 在之前的文章Java中多If else优化 (三)----工厂+策略模式优化中提到InitializingBean接口,继承该接口的Bean在初始化完成后,会执行重写的afterPropertiesSet()方法,但在新项目中发现直到项目启动完成,实现类的afterPropertiesSet()方法也没有被执行。 public interf...

小东东 9241

PCL 法向量夹角剔除错误匹配点对【2026最新版】

实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 41万+

Spring中bean的执行初始化和销毁方法的4种方式详解

一、引入 在java的实际开发过程中,我们可能需要在spring实例化一个bean的过程中,使用到初始化一个对象(bean)后立即初始化(加载)一些数据,或者在销毁一个对象之前进行执行一些事情等等。 因此Spring为我们提供了一系列的方式: 方式 初始化 init 销毁destroy 1 @bean 注解,指定属性initMethod @bean 注解,指定属性destroyMethod 2 xml形式,指定 init-method xml形式,指定 destroy-method

1870

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

(九)Spring中Bean的生命周期(上)

Spring官网阅读(九)Spring中Bean的生命周期(上) 在之前的文章中,我们一起学习过了官网上容器扩展点相关的知识,包括FactoryBean,BeanFactroyPostProcessor,BeanPostProcessor,其中BeanPostProcessor还剩一个很重要的知识点没有介绍,就是相关的BeanPostProcessor中的方法的执行时机。之所以在之前的文章中没有介绍是因为这块内容涉及到Bean的生命周期。在这篇文章中我们开始学习Bean的生命周期相关的知识,整个Bean的

开心就好 6470

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何在Spring中使用注解配置Bean的生命周期回调方法?

注解作用适用场景核心特点初始化回调(Bean 就绪前)初始化资源(连接、配置加载)JSR-250 标准注解,解耦 Spring销毁回调(Bean 销毁前)释放资源(关闭连接、线程池)JSR-250 标准注解,解耦 Spring初始化 / 销毁回调兼容老代码、第三方类(无法加注解)基于@Bean注解配置,灵活度高和是 JDK 标准注解(JSR-250),无需依赖 Spring 特定接口,是开发首选。首选方式:自定义 Bean 直接用(初始化)和(销毁),解耦且简洁;兼容场景。

xiaoye3708的博客 248

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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万+

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

Spring 提供了多种方式来指定和调用 Bean 的初始化方法和销毁方法,包括。

专注于技术分享 1659

【Spring高级】Bean的初始化和销毁有哪些方式

Spring中Bean的初始化和销毁有哪些方式

qq_43745578的博客 1902

实现Bean对象的初始化和销毁方法

深入理解Bean对象的初始化和销毁方法

小凯的博客 1345

springboot中bean的几种初始化方法与销毁方法的执行顺序

初始化方法: 1、实现InitializingBean,重写afterPropertiesSet方法 2、直接使用initBean方法,需要指定init-method 3、使用@PostConstruct注解 private String name; /** * 构造方法 * @param name */ public InitSor...

niuzh的博客 1万+
下一篇: Spring源代码中设计模式
NextX工作室
博客等级 码龄18年 21粉丝 21原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值