0

0

Java中Bean的生命周期 详解Spring Bean创建到销毁的完整过程

冰火之心

冰火之心

发布时间:2025-06-28 22:13:01

|

714人浏览过

|

来源于php中文网

原创

spring bean的生命周期主要包括以下阶段:1.beandefinition的解析和注册;2.bean的实例化;3.属性填充(依赖注入);4.aware接口的处理;5.beanpostprocessor的前置处理;6.initializingbean接口的处理;7.自定义初始化方法;8.beanpostprocessor的后置处理;9.bean的使用;10.disposablebean接口的处理;11.自定义销毁方法。spring bean的作用域包括singleton、prototype、request、session、application、websocket,分别适用于不同的应用场景。自定义初始化和销毁方法可通过实现initializingbean和disposablebean接口、使用init-method和destroy-method属性或@postconstruct和@predestroy注解实现,推荐使用注解方式。beanpostprocessor在bean的初始化前后进行额外处理,可用于aop、自动装配、属性校验等功能,并可通过ordered接口或@order注解控制执行顺序。

Java中Bean的生命周期 详解Spring Bean创建到销毁的完整过程

Spring Bean的生命周期,简单来说,就是Bean从创建到最终销毁的整个过程。理解这个过程,能帮助我们更好地掌握Spring框架,进行更高效的开发和调试。

Java中Bean的生命周期 详解Spring Bean创建到销毁的完整过程

Spring Bean的生命周期,就像一个人的成长历程,从出生(创建)到经历各种阶段(属性设置、初始化)再到最终的死亡(销毁)。

Java中Bean的生命周期 详解Spring Bean创建到销毁的完整过程

解决方案

立即学习Java免费学习笔记(深入)”;

Spring Bean的生命周期主要包括以下几个阶段:

Java中Bean的生命周期 详解Spring Bean创建到销毁的完整过程
  1. BeanDefinition的解析和注册: Spring容器启动时,会读取配置文件或注解,解析Bean的定义信息(BeanDefinition),并将其注册到BeanDefinitionRegistry中。这个过程相当于给Bean“登记户口”。

  2. Bean的实例化: 当需要使用Bean时,Spring容器会根据BeanDefinition的信息,利用反射或CGLIB等技术,创建一个Bean的实例。这就像Bean的“出生”。

  3. 属性填充(依赖注入): Bean实例化后,Spring容器会将Bean所依赖的其他Bean或值注入到Bean的属性中。这就像Bean开始“吸收营养”,逐渐成长。

  4. Aware接口的处理: 如果Bean实现了某些Aware接口(例如BeanNameAware、BeanFactoryAware、ApplicationContextAware),Spring容器会调用这些接口的方法,将相应的对象注入到Bean中。这就像Bean开始“了解世界”,获取一些外部信息。

  5. BeanPostProcessor的前置处理: 在Bean初始化之前,Spring容器会调用所有BeanPostProcessor的postProcessBeforeInitialization方法,对Bean进行一些额外的处理。这就像Bean在“正式上岗”前,接受一些培训或调整。

  6. InitializingBean接口的处理: 如果Bean实现了InitializingBean接口,Spring容器会调用其afterPropertiesSet方法,进行一些自定义的初始化操作。这就像Bean开始“正式上岗”,做一些准备工作。

  7. 自定义初始化方法: 如果在Bean的定义中指定了初始化方法(通过init-method属性或@PostConstruct注解),Spring容器会调用该方法,进行一些自定义的初始化操作。这就像Bean开始“大展身手”,正式开始工作。

  8. BeanPostProcessor的后置处理: 在Bean初始化之后,Spring容器会调用所有BeanPostProcessor的postProcessAfterInitialization方法,对Bean进行一些额外的处理。这就像Bean在“工作期间”,接受一些指导或改进。

  9. Bean的使用: Bean被创建和初始化后,就可以被应用程序使用了。

  10. Bean的销毁: 当应用程序不再需要Bean时,Spring容器会销毁该Bean。

  11. DisposableBean接口的处理: 如果Bean实现了DisposableBean接口,Spring容器会调用其destroy方法,进行一些自定义的销毁操作。这就像Bean在“退休”前,做一些告别或清理工作。

  12. 自定义销毁方法: 如果在Bean的定义中指定了销毁方法(通过destroy-method属性或@PreDestroy注解),Spring容器会调用该方法,进行一些自定义的销毁操作。这就像Bean“安详离世”,结束了一生。

Spring Bean的几种作用域?

Spring Bean的作用域定义了Bean的实例是如何创建和共享的。常见的几种作用域包括:

  • singleton: 单例模式,Spring IoC容器中只会存在一个共享的Bean实例。这也是默认的作用域。

    BibiGPT-哔哔终结者
    BibiGPT-哔哔终结者

    B站视频总结器-一键总结 音视频内容

    下载
  • prototype: 每次请求都会创建一个新的Bean实例。

  • request: 每次HTTP请求都会创建一个新的Bean实例,仅适用于Web应用。

  • session: 在一个HTTP Session中,一个Bean定义对应一个实例,仅适用于Web应用。

  • application: 在整个Web应用的ServletContext中,一个Bean定义对应一个实例,仅适用于Web应用。

  • websocket: 在一个WebSocket会话期间,一个Bean定义对应一个实例,仅适用于Web应用。

选择合适的作用域,可以有效地管理Bean的生命周期和资源消耗。例如,对于无状态的服务类,通常使用singleton作用域;而对于需要存储用户特定信息的Bean,则可以使用session作用域。

如何自定义Bean的初始化和销毁方法?

自定义初始化和销毁方法,可以让我们在Bean创建和销毁时执行一些额外的操作,例如加载配置文件、释放资源等。Spring提供了多种方式来定义这些方法:

  • 实现InitializingBean和DisposableBean接口: Bean可以实现这两个接口,并分别实现afterPropertiesSetdestroy方法。这种方式比较简单,但会侵入Bean的代码。

  • 使用init-methoddestroy-method属性: 在Bean的定义中,可以使用init-methoddestroy-method属性来指定初始化和销毁方法。这种方式不会侵入Bean的代码,但需要在配置文件中进行配置。

  • 使用@PostConstruct@PreDestroy注解: 可以使用这两个注解来标记初始化和销毁方法。这种方式既不会侵入Bean的代码,也不需要在配置文件中进行配置,使用起来比较方便。

推荐使用@PostConstruct@PreDestroy注解,因为它们更加简洁和方便。

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class MyBean {

    @PostConstruct
    public void init() {
        System.out.println("Bean initialized");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("Bean destroyed");
    }
}

BeanPostProcessor在Spring Bean生命周期中的作用是什么?

BeanPostProcessor是Spring框架提供的一种扩展机制,允许我们在Bean的初始化前后对Bean进行额外的处理。BeanPostProcessor接口定义了两个方法:postProcessBeforeInitializationpostProcessAfterInitialization,分别在Bean初始化之前和之后被调用。

BeanPostProcessor可以用于实现很多功能,例如:

  • AOP: Spring AOP就是通过BeanPostProcessor来实现的,它可以在Bean初始化后,为Bean创建代理对象,从而实现横切关注点的织入。

  • 自动装配: 可以通过BeanPostProcessor来实现自定义的自动装配逻辑。

  • 属性校验: 可以在Bean初始化前,对Bean的属性进行校验。

  • 修改Bean的属性: 可以在Bean初始化前后,修改Bean的属性值。

BeanPostProcessor的实现原理是,Spring容器会在Bean初始化前后,依次调用所有注册的BeanPostProcessor的相应方法。因此,BeanPostProcessor的执行顺序非常重要,可以通过实现Ordered接口或使用@Order注解来控制BeanPostProcessor的执行顺序。

理解BeanPostProcessor的作用,可以帮助我们更好地扩展Spring框架的功能,实现更加灵活和强大的应用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

114

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

29

2026.01.26

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

315

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

748

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

92

2025.08.19

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1103

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

192

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1582

2025.12.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.6万人学习

Pandas 教程
Pandas 教程

共15课时 | 1.0万人学习

NumPy 教程
NumPy 教程

共44课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号