Spring中Bean的生命周期方法有哪些?

Spring(09)——bean生命周期回调方法 9 生命周期回调方法对于Spring bean来讲,我们默认可以指定两个生命周期回调方法。一个是在ApplicationContext将bean初始化,包括注入对应的依赖后的回调方法;另一个是在ApplicationContext准备销毁之前的回调方法。要实现这种回调主要有三种方式:实现特定的接口、在XML配置文件中指定回调方法和使用JSR-250标准的注解。9.1 实现特定接口针对bean初始化 阅读详情

在 Spring 框架中,Bean 的生命周期涵盖了从创建到销毁的完整过程。理解这些生命周期方法有助于实现资源初始化、依赖注入后的处理以及资源释放等功能。以下是 Spring Bean 生命周期的关键方法和阶段:

1. 核心生命周期阶段

Spring Bean 的完整生命周期包含以下主要阶段:

  1. 实例化:通过构造器或工厂方法创建 Bean 实例。
  2. 属性注入:完成 Bean 的依赖注入(如 @Autowired、@Resource)。
  3. 初始化回调:执行自定义初始化逻辑(如 @PostConstruct、InitializingBean)。
  4. Bean 后置处理器:在初始化前后执行额外处理(如 AOP 代理)。
  5. 使用 Bean:Bean 就绪并可被应用使用。
  6. 销毁回调:在容器关闭时执行资源释放(如 @PreDestroy、DisposableBean)。

2. 初始化相关方法

2.1 @PostConstruct 注解

JSR-250 规范注解,在依赖注入完成后立即执行。

@Component
public class MyBean {
    @PostConstruct
    public void init() {
        // 初始化逻辑
        System.out.println("MyBean 初始化完成");
    }
}
2.2 InitializingBean 接口

实现 afterPropertiesSet() 方法,在属性注入后执行。

@Component
public class MyBean implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        // 初始化逻辑
        System.out.println("MyBean 属性设置完成,执行初始化");
    }
}
2.3 XML 配置中的 init-method

在 XML 配置中指定初始化方法:

<bean id="myBean" class="com.example.MyBean" init-method="customInit"/>
public class MyBean {
    public void customInit() {
        // 自定义初始化方法
    }
}

3. 销毁相关方法

3.1 @PreDestroy 注解

JSR-250 规范注解,在 Bean 销毁前执行。

@Component
public class MyBean {
    @PreDestroy
    public void cleanup() {
        // 资源释放逻辑
        System.out.println("MyBean 准备销毁");
    }
}
3.2 DisposableBean 接口

实现 destroy() 方法,在 Bean 销毁前执行。

@Component
public class MyBean implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        // 资源释放逻辑
        System.out.println("MyBean 执行销毁方法");
    }
}
3.3 XML 配置中的 destroy-method

在 XML 配置中指定销毁方法:

<bean id="myBean" class="com.example.MyBean" destroy-method="customDestroy"/>
public class MyBean {
    public void customDestroy() {
        // 自定义销毁方法
    }
}

4. BeanPostProcessor 接口

在 Bean 初始化前后执行额外处理,常用于 AOP 代理或自定义增强。

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在初始化方法(如 @PostConstruct)之前执行
        System.out.println("Before initialization: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 在初始化方法之后执行
        System.out.println("After initialization: " + beanName);
        return bean; // 可返回代理对象替换原 Bean
    }
}

5. BeanFactoryPostProcessor 接口

在 Bean 定义加载后、实例化前修改 Bean 定义,属于容器级处理器。

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 修改 Bean 定义
        BeanDefinition beanDefinition = beanFactory.getBeanDefinition("myBean");
        beanDefinition.setScope(ConfigurableBeanFactory.SCOPE_PROTOTYPE);
    }
}

6. 生命周期方法执行顺序

当多种初始化/销毁方法同时存在时,执行顺序如下:

初始化顺序:
  1. Bean 实例化(构造器)
  2. 属性注入(@Autowired 等)
  3. @PostConstruct 注解方法
  4. InitializingBean.afterPropertiesSet()
  5. XML 配置的 init-method
  6. BeanPostProcessor.postProcessAfterInitialization()
销毁顺序:
  1. @PreDestroy 注解方法
  2. DisposableBean.destroy()
  3. XML 配置的 destroy-method

7. 示例代码

以下是一个完整示例,演示 Bean 生命周期方法的执行:

@Component
public class MyBean implements InitializingBean, DisposableBean {
    private String name;

    public MyBean() {
        System.out.println("MyBean 构造器被调用");
    }

    @Autowired
    public void setName(String name) {
        this.name = name;
        System.out.println("注入 name 属性: " + name);
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("@PostConstruct 方法被调用");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean.afterPropertiesSet() 被调用");
    }

    public void customInit() {
        System.out.println("XML 配置的 init-method 被调用");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("@PreDestroy 方法被调用");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean.destroy() 被调用");
    }

    public void customDestroy() {
        System.out.println("XML 配置的 destroy-method 被调用");
    }
}

8. 总结

  • 初始化方法:@PostConstruct → InitializingBean → init-method。
  • 销毁方法:@PreDestroy → DisposableBean → destroy-method。
  • 处理器:BeanFactoryPostProcessor 处理 Bean 定义,BeanPostProcessor 处理 Bean 实例。
  • 最佳实践:优先使用 @PostConstruct 和 @PreDestroy 注解,避免过度实现接口。

通过掌握 Bean 的生命周期方法,可以更好地控制 Bean 的初始化和销毁过程,实现资源的正确管理和应用的优雅退出。

Spring面试题16:Spring框架中的单例bean是线程安全的吗?Spring bean的生命周期?哪些是重要的bean生命周期方法? 实例化阶段包括Bean的创建和属性注入。初始化阶段执行Bean的初始化方法,并且在使用阶段中可以执行业务逻辑。最后,在销毁阶段,Spring容器会调用Bean的销毁方法,进行资源的释放。 阅读详情

相关推荐

人形机器人骨骼材料选型实战:从铝合金到碳纤维的5种方案对比

本文深入探讨人形机器人骨骼材料的选型策略,对比铝合金、镁合金、钛合金、碳纤维复合材料及3D打印材料等5种方案的性能优劣。通过建立强度-重量比、疲劳寿命等核心评价维度,结合具体应用场景,提供科学的材料决策方法论,助力开发者优化机器人结构设计,实现性能与成本的平衡。

weixin_29199873的博客 441

Spring bean生命周期之doCreateBean方法详解

Spring bean声明周期之doCreateBean方法详解前言@ValuecreateBean方法详解实例化前方法调用实例化前初始化后doCreateBeanapplyMergedBeanDefinitionPostProcessors填充属性&实例化后(populateBean)@AutoWired的实现逻辑&属性填充后的后置处理器初始化BeaninitializeBean初始化前后置处理器初始化方法 前言 在上一篇笔记中我们介绍了bean的初始化声明周期,但是期间有个最核心的方法c

JAVA技术爱好者 3668

新手别怕!用‘东北天’和‘右前上’坐标系,5分钟搞懂惯性导航姿态矩阵(含Python验证代码)

本文通过‘东北天(ENU)’和‘右前上(RFU)’坐标系,详细解析惯性导航中的姿态矩阵概念。包含Python代码验证,帮助新手快速理解坐标变换、欧拉角及旋转矩阵的构建与应用,特别强调有限转动不可交换性与无限转动次序无关的区别。

weixin_29062255的博客 332

spring管理bean的生命周期与spring通过工厂方法配置bean

IOC容器中bean的生命周期方法 SpringIOC容器可以管理bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务 SpringIOC容器对Bean的生命周期进行管理的过程:  1 通过构造器或工厂方法创建bean实例  2 位bean的属性设置值和对其他bean的引用  3 调用bean的初始化方法  4 bean可以使用了  5 当容器关闭时,调用be

youjiangtengwan1的博客 750

Python爬虫实战:用BeautifulSoup和Pandas轻松抓取去哪儿网景点数据(附完整代码)

本文详细介绍了如何使用Python的BeautifulSoup和Pandas库构建一个高效的旅游数据爬虫,从去哪儿网抓取景点数据。内容涵盖环境准备、网页结构分析、核心代码实现、反爬策略以及数据清洗与存储,提供完整代码示例,帮助开发者快速掌握数据采集技术。

river的博客 357

手把手教你读懂蓝牙BQB射频测试报告:以PRBS9为例的实战分析

本文以蓝牙BQB射频测试中的PRBS9信号为例,提供了一份实战分析指南。文章深入解读了输出功率、调制特性、邻道泄漏等核心测试项,并分享了信号分析仪操作技巧、测试环境搭建要点及设备选型建议,旨在帮助工程师精准解读报告,高效定位问题,确保产品顺利通过认证。

weixin_29289821的博客 261

Spring源码-Bean的生命周期和模板方法

之前我们提到过SpringApplication的run方法不光可以启动程序,还会返回一个容器,为了演示Bean的从创建到销毁的整个阶段,我们会关闭掉容器。接下来我们来看想要加入到容器当中的类,映入眼帘的是这几个方法和其注解,先来解释一下这几个注解。@PostConstruct注解是进行Bean初始化的方法,@PreDestroy的Bean销毁的方法,这里仅限于单例Bean,多例Bean销毁的时机还是和单例Bean不太一样的。@Value是用来进行值注入的,可以注入配置里的信息或者系统环境变量。

QWERTYUIef的博客 1044

MATLAB打开.m文件乱码解决办法

Matlab打开.m文件出现中文乱码问题,是因为Matlab存在两种编码格式:GBK和UTF-8,而不同版本的Matlab编码格式可能不统一,因此在不同版本的Matlab打开文件,由于编码格式的改变,会导致注释乱码。 1.查看你的Matlab的文件编码方式,在Matlab的命令行窗口输入feature('locale') ,如下图,可以看到默认编码为GBK,那问题就变成了将Matlab的文件编码方式GBK修改成UTF-8; 2.找到你的Matlab安装目录bin文件夹下的lcdata_utf.

zhugby的博客 4万+

Spring容器bean生命周期方法

部分bean的生命周期方法 文章目录部分bean的生命周期方法BeanPostProcessorBeanFactoryAware BeanPostProcessor 这个是容器级别的,也就是说对所有的bean初始化过程都会参与。 public interface BeanPostProcessor { //初始化前执行 Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception; //初始化

头皮发麻 443

目标检测 RT-DETR(2023)详细解读

在使用了这个技巧后,显然训练过程中,类别的标签不再是此前的0和1离散值,而是0~1的连续值。关于 Query Selection(查询向量选择),大家应该并不陌生,这个方法可谓在DETR领域大杀四方,如DAB-DETR对查询向量进行重构理解,将其解释为Anchor,DN-DETR通过查询降噪来应对匈牙利匹配的二义性所导致的训练时间长的问题,DINO提出从Encoder中选择Top-k特征进行学习等一系列方法,这都无疑向我们证明,查询向量很重要,选择好的Query能够让我们事半功倍。在RT-DETR中,

qq_51352130的博客 5870

使用 Python 爬虫抓取 IMDb 电影信息 - 评分、评论与基本信息抓取教程

本文介绍了如何使用 Python 爬虫技术抓取 IMDb 电影评分、评论和基本信息。我们分别展示了通过IMDb API和两种方法抓取数据,并进行了数据存储、分析与可视化。在未来,我们还可以基于这些数据开发电影推荐系统、情感分析工具等,进一步丰富电影数据的应用场景。通过这些实践,您不仅学会了如何抓取和存储数据,还可以通过这些基础来构建自己的数据分析应用,获取更丰富的电影数据。

2201_76125261的博客 601

spring中bean的细节 三种创建bean对象的方法 bean作用范围 bean对象的生命周期

spring中bean的细节 一、之三种创建bean对象的方法 把对象的创建交给spring来管理 <!-- spring对bean的管理细节 1.创建bean的三种方式 2.bean对象的作用范围 3.bean对象的生命周期 --> 创建Bean的三种方式 第一种方式:使用默认构造函数创建。 在spring的配置文件中使用bea...

韦恩少爷的博客 494

【STK】手把手教你利用STK进行弹道导弹和运载火箭发射仿真的相关方法全过程解析

写这个系列主要是这几年做了一些弹道导弹和运载火箭发射的相关仿真项目,stk软件由于其专业性在国内比较小众,相关的教程和书籍、经验贴都不是很多,因此新手在进行开发中容易遇到较多困难,把自己的一些经验体会写下来,一方面供自己总结回顾,另一方面也希望对大家有所帮助。这个系列计划分几篇文章写完,每章的内容结构相似,都分为①如何确定发射场位置和发射轨迹、②导入导弹和运载火箭模型、③设计模型分段动作、④飞行参数分析和相关应用这四个部分,每篇文章争取完整描述1-2个实际项目的操作过程。

weixin_44184852的博客 5988

Spring 框架Bean的生命周期方法

Spring IOC可以管理bean的生命周期,Spring 允许在bean的生命周期特定点执行定制的任务。 Bean的后置处理器允许在调用初始化方法前后对Bean进行额外的处理。 Bean后置处理器对IOC里的所有Bean实例逐一处理,而非单一实例。典型应用:检查Bean属性的正确性或根据特定的标准更改Bean的属性。 对Bean的后置处理器而言,需要实现接口BeanPostProcessor

蛾子 453

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

详解Spring中bean生命周期回调方法

对于spring的bean来讲,我们默认可以指定两个生命周期回调方法。一个是在ApplicationContext将bean初始化完全完成后,包括注入对应的依赖(例如属性注入)后的回调方法;另一个是在ApplicationContext准备销毁之前的回调方法。 要实现这种回调主要有三种方式: 实现特定的接口。 在XML配置文件中指定回调方法。 使用JSR-250标准的注解。 关于生命周期...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 1799

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

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

Spring Bean生命周期回调的三种方法

Bean 的生命周期回调方法主要有两种,一种是在初始化的时候调用的,另一种是在Bean生命周期结束时调用的。 主要有三种方式: 1. 通过@PostConstruct和@PreDestroy注解来实现 实例代码: public class UserService { @PostConstruct public void init(){ System.out.println("init----"); } @PreDestroy public void d

weixin_40026129的博客 870

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring—IOC容器中Bean的生命周期方法

1. IOC容器中Bean的生命周期方法 Spring IOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的服务 具体管理的过程如下: 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其它Bean的引用 调用Bean的初始化方法 开始使用Bean 当容器关闭时,调用Bean的销毁方法 在Bean的声明里设置init-method和...

qq_35556254的博客 242

Spring的Bean生命周期内的callback方法和Spring容器启动关闭时的callback方法

通过Spring管理的bean,在其生命周期内可以配置被Spring调用的callback方法一般有两种:通过实现Spring提供的特点接口和通过配置callback方法.(如果bean是prototype的话,由于其销毁不被Spring管理,其销毁方法不会被调用) 1,通过实现Spring提供的特点接口:通过实现InitializingBean接口,Spring容器会在初始化bean的时候调用

交换一个思想,能得到俩思想 9547

Spring之Bean的生命周期过程中调用的方法

BeanPostProcessor的两个方法是所有Bean都会调用,除了实现这个接口的Bean,所以为了方便加了判断。

qq_45923849的博客 369

在Spring Bean的生命周期中各方法的执行顺序

Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下十种:通过实现 InitializingBean 接口来定制初始化之后的操作方法;通过实现DisposableBean 接口来定制销毁之前的操作方法;通过元素的 init-method属性指定初始化之后调用的操作方法;通过元素的 destroy-method属性指定销毁之前调用的操作方法;

chenzoff的专栏 446

spring1-test10-创建带有生命周期方法的bean

实验10:创建带有生命周期的bean 生命周期:bean的创建到销毁; ioc容器中得注册的bean: 单实例bean:容器启动时就会创建好,容器关闭也会销毁创建的bean。 多实例bean:在获取的时候才创建,但是得自己写方法来销毁。 我们可以为bean自定义生命周期的一些方法,spring在调用时这些方法。 自定义初始化方法和销毁方法。 <bean id="book01" cl...

Shen_R的博客 205

Spring-框架-bean生命周期回调方法注解

生命周日回调方法: bean的生命周期: init():初始化方法 destory():销毁方法 对应的注解: @PostConstruct:注解用在方法上,用于bean初始化之后的行为方法 init(){} @PreDestroy:注解用在消费方法上面,在bean消费之前调用该注解方法 destroy(){} 代码: packa...

629

Spring中Bean的生命周期和具体实现方法

Bean的生命周期:初始化,创建并使用,销毁。 现在来说说四种完成Bean生命周期的方法: 方法一: 适用于Bean()+返回值的方式 -->返回值给Ioc容器 init()初始化 destory()销毁 xml配置:init-method="xxx" destory-method="xxx" 注解形式:@Bean(value="xxx",initMethod="x...

weixin_43729854的博客 454

Spring学习之路(三):Bean完整的生命周期及使用后处理Bean产生代理增强特定方法

内容简介一、Spring Bean完整的生命周期流程二、演示Bean完整的生命周期三、使用后处理Bean产生代理增强方法四、总结 一、Spring Bean完整的生命周期流程 Instantiate 实例化Bean,这一步是使用Bean的构造方法实例化Bean,可以是无参构造方法也可以是有参构造方法。 Populate properties 如果该Bean有属性且已经声明让Spring注入则会...

萧邦主的城邦 715

Spring Bean 生命周期 三种表示方法

文章的索引: 通过接口InitializingBean,DisposableBean实现Bean生命周期。通过JavaEE注解@PostConstruct,@PreDestroy实现Bean生命周期。通过配置文件标签属性init-method和destroy-method实现Bean生命周期。 因为演示的需要,首先给出一个普通的bean: public class SimpleBean

Benson的专栏 2199

Spring Bean 生命周期方法 InitializingBean、init-method、PostConstruct等

概述 spring 中bean的生命周期方法: 通过 <bean> 元素的 init-method/destroy-method 属性指定初始化之后 /销毁之前调用的操作方法 通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法; 在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法...

江城宴的博客 811
上一篇: Spring框架中Bean的作用域详解
下一篇: 如何保证rabbitMQ中消息的幂等性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值