当前位置: 首页 > news >正文

Spring Bean生命周期简介-笔记

1. Spring Bean 生命周期概述

Spring 框架中,Bean 的生命周期是其核心机制之一。了解 Bean 的完整生命周期有助于开发者更好地控制对象的创建、初始化、使用和销毁过程,尤其是在需要扩展、增强或定制 Bean 行为时,如资源加载、AOP 代理、日志记录等。

Spring Bean 的生命周期通常包括以下阶段(以 Singleton 作用域 为例):

阶段描述可干预方式开发中可能的操作
1. 实例化通过反射创建 Bean 实例无需干预通常由 Spring 自动完成
2. 属性注入注入依赖属性(字段、构造器、setter)无需干预通过 @Autowired@Resource 注入依赖
3. 前处理(BeforeInit):

在初始化方法之前执行;

执行方法BeanPostProcessor#postProcessBeforeInitialization

实现BeanPostProcessor 接口修改 Bean 属性、创建代理、日志记录
4. 初始化方法执行 @PostConstructInitializingBean#afterPropertiesSet()、或 init-method使用注解或配置资源加载(如数据库连接)、校验逻辑、预处理
5. 后处理(AfterInit):

在初始化方法之后执行;

执行方法BeanPostProcessor#postProcessAfterInitialization

实现BeanPostProcessor 接口AOP 代理创建、权限控制、日志记录
6. 使用阶段Bean 已准备好,可供应用使用无需干预业务调用、依赖注入
7. 销毁方法容器关闭时执行 @PreDestroyDisposableBean#destroy()、或 destroy-method使用注解或配置资源释放(如关闭连接池、停止线程)

2. Spring Bean生命周期的代码演示

2.1 代码示例

step1. 定义一个 Bean

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;@Component
public class MyBean implements InitializingBean, DisposableBean {public MyBean() {System.out.println("1. MyBean 实例化");}public void initMethod() {System.out.println("4. init-method: 初始化方法");}@PostConstructpublic void postConstruct() {System.out.println("4. @PostConstruct: 初始化方法");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("4. InitializingBean#afterPropertiesSet: 初始化方法");}@PreDestroypublic void preDestroy() {System.out.println("7. @PreDestroy: 销毁方法");}@Overridepublic void destroy() throws Exception {System.out.println("7. DisposableBean#destroy: 销毁方法");}
}

step2. 定义一个 BeanPostProcessor

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("3. BeanPostProcessor#postProcessBeforeInitialization: " + beanName);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("5. BeanPostProcessor#postProcessAfterInitialization: " + beanName);return bean;}
}

step3. 配置 Bean 的 init 和 destroy 方法(可选)

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

step4. 主启动类(Spring Boot 示例)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Application {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);MyBean myBean = context.getBean(MyBean.class);System.out.println("6. Bean 已使用");// 关闭容器以触发销毁方法context.close();}
}

启动主类后,控制台输出顺序(部分)示例

1. MyBean 实例化
3. BeanPostProcessor#postProcessBeforeInitialization: myBean
4. @PostConstruct: 初始化方法
4. InitializingBean#afterPropertiesSet: 初始化方法
4. init-method: 初始化方法
5. BeanPostProcessor#postProcessAfterInitialization: myBean
6. Bean 已使用
7. @PreDestroy: 销毁方法
7. DisposableBean#destroy: 销毁方法

2.2 注意事项

  • 多个初始化/销毁方法:Spring 支持多种方式定义初始化和销毁方法,按照以下优先级执行:
    • @PostConstruct > InitializingBean#afterPropertiesSet() > init-method
    • @PreDestroy > DisposableBean#destroy() > destroy-method
  • Bean 作用域影响
    • @Scope("prototype") 的 Bean 不会执行 destroy 方法,除非手动调用 destroy()
  • BeanPostProcessor 顺序:如果有多个 BeanPostProcessor,可通过 @Order 或实现 Ordered 接口控制执行顺序。

3. 总结

Spring Bean 的生命周期是一个清晰且可扩展的过程。通过理解每个阶段的功能和干预方式,开发者可以灵活地控制 Bean 的行为,实现诸如 AOP、日志、资源管理等高级功能。掌握生命周期不仅有助于调试,还能帮助构建更加健壮和可维护的 Spring 应用。相关应用场景举例如下:

场景使用阶段
日志记录BeanPostProcessor
资源加载初始化方法(@PostConstruct
代理对象创建postProcessAfterInitialization(AOP 实现)
数据库连接关闭销毁方法(@PreDestroy
权限控制postProcessBeforeInitialization

4.相关文档

BeanPostProcessor用法-笔记-CSDN博客

InitializingBean接口和@PostConstruct-笔记_postconstruct和initializingbean-CSDN博客

SpringBoot启动后自动执行方法的各种方式-笔记_springboot项目启动自动调用方法-CSDN博客

Spring的xxxAware接口工作原理-笔记-CSDN博客

相关文章:

  • 基于千眼狼高速摄像机与三色掩模的体三维粒子图像测速PIV技术
  • 图像增强技术
  • Java项目层级介绍 java 层级 层次
  • 【Unity3D插件】Unity3D插件之天气系统/日夜系统插件-UniStorm
  • 如何有效追踪需求的实现情况
  • 计算机中常见的计量单位总结(bit、byte、KB、MB、Gbps 区别详解)
  • (leetcode) 力扣100 10.和为K的子数组(前缀和+哈希)
  • matlab simulink双边反激式变压器锂离子电池均衡系统,双目标均衡策略,仿真模型,提高均衡速度38%
  • er图的概念
  • 基于 Spring Boot 瑞吉外卖系统开发(十二)
  • Android学习总结之线程池篇
  • 使用SSH协议克隆详细步骤
  • stm32之BKP备份寄存器和RTC时钟
  • TCPIP详解 卷1协议 八 ICMPv4和ICMPv6 Internet控制报文协议
  • 深入掌握CSS定位:构建精密布局的核心技术
  • 第二章、物理层
  • 开发环境(Development Environment)
  • 【SSM-Mybatis(一)】java持久层框架-Mybatis!本文涵盖介绍Mybatis和基本使用,分析Mybatis核心配置文件
  • 豆瓣电影Top250数据工程实践:从爬虫到智能存储的技术演进(含完整代码)
  • 【Ansible】之inventory主机清单
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额超5万元
  • 旭辉控股集团主席林中:债务重组是活下来的前提,自营开发业务收缩至少数核心城市
  • 茅台1935今年动销达到预期,暂无赴港上市计划!茅台业绩会回应多个热点
  • 最高降价三成,苹果中国iPhone开启大促销,能拉动多少销量?
  • “无锡景・江南韵”:中国评弹艺术在尼日利亚收获众多粉丝
  • 《审判》|“被告”的魅力:K在等什么?