SpringBean生命周期的执行流程

server/2025/2/21 2:21:25/

Spring Bean 的生命周期,就是一个 Bean 对象从诞生到消亡所经历的一系列过程,咱们可以把它想象成一个人从出生到去世的一生,下面详细给你讲讲:

1. 出生(实例化)

这就好比一个新生命呱呱坠地。Spring 容器就像是一个 “生命孕育室”,它根据你配置的 Bean 信息,用反射的方式创建出 Bean 对象。比如你在配置文件里说要创建一个 “厨师 Bean”,Spring 就会调用厨师类的构造方法,把厨师对象 “生” 出来。

2. 成长准备(属性赋值)

婴儿出生后,得给他准备各种生活用品,比如奶瓶、衣服等。对于 Bean 来说,就是要给它设置各种属性。你可以在配置文件里或者用注解指定这些属性的值,Spring 会把这些值注入到 Bean 对象里。就像给厨师配备好锅、铲子等厨具。

3. 了解环境(实现 Aware 接口)

人长大一些后,会开始了解自己所处的环境。如果 Bean 实现了Aware系列接口,Spring 就会调用相应的方法,让 Bean 知道自己在 Spring 容器里的一些信息。比如BeanNameAware能让 Bean 知道自己在容器里的名字,就好像人知道自己叫什么一样;ApplicationContextAware能让 Bean 获取到应用上下文,就好比人了解自己生活的社区环境。

4. 上学前准备(BeanPostProcessor 前置处理)

在孩子上学之前,可能会去参加一些学前培训,做一些入学前的准备。对于 Bean 来说,Spring 会调用BeanPostProcessorpostProcessBeforeInitialization方法,在 Bean 正式 “上学”(初始化)之前对它进行一些额外的处理,比如给它修改一下属性值,就像给孩子调整一下书包里的文具。

5. 上学成长(初始化)

孩子到了上学的年龄,就开始在学校里学习知识、不断成长。Bean 也一样,它会进行初始化操作。有两种方式来完成这个过程:

  • 实现InitializingBean接口:如果 Bean 实现了这个接口,Spring 会调用它的afterPropertiesSet方法,就好像孩子在学校里按照老师的要求完成一些学习任务。
  • 自定义初始化方法:你还可以在 Bean 定义里指定一个自己写的初始化方法,Spring 也会在合适的时候调用它,这就好比孩子自己有一些独特的学习方法。

6. 毕业评估(BeanPostProcessor 后置处理)

孩子毕业后,学校会对他进行评估,看看他在学校的学习成果。对于 Bean 来说,Spring 会调用BeanPostProcessorpostProcessAfterInitialization方法,在 Bean 初始化完成后做一些最后的检查和调整,比如给它创建一个代理对象,就像给孩子做一个毕业总结。

7. 工作贡献(使用 Bean)

经过前面的成长阶段,孩子可以走上工作岗位,为社会做出贡献了。Bean 也是如此,它可以在 Spring 应用里被其他组件使用,通过依赖注入的方式提供自己的服务,就像厨师在厨房里做出美味的菜肴供大家享用。

8. 退休离世(销毁)

人到了一定年龄会退休,最后离开这个世界。当 Spring 容器关闭时,会对需要销毁的 Bean 进行处理。同样有两种方式:

  • 实现DisposableBean接口:如果 Bean 实现了这个接口,Spring 会调用它的destroy方法,就好像人在离世前处理好自己的后事。
  • 自定义销毁方法:你也可以在 Bean 定义里指定一个自定义的销毁方法,Spring 会在容器关闭时调用它,比如关闭数据库连接、释放资源等,就像人把自己的财产进行分配。

这样解释是不是就很好理解啦,简单来说就是 Bean 从创建、准备、成长、使用到销毁的一个完整过程。

能详细回答一下 Spring Bean 生命周期的执行流程吗 回答的通俗易懂

Spring Bean 的生命周期就像是一个员工在一家公司完整的工作经历,下面我们来详细说说每个阶段:

1. 招聘入职(实例化 Instantiation)

公司根据岗位需求发布招聘信息,就如同 Spring 容器根据配置信息知道需要创建某个 Bean。当找到合适的候选人后,就会让他入职,这就相当于 Spring 利用反射机制,通过调用 Bean 类的构造方法来创建 Bean 实例。例如,公司要招聘一名程序员,通过一系列流程让张三入职,Spring 也是这样把一个 Bean 对象 “招进” 容器。

2. 入职培训(属性赋值 Populate Properties)

新员工入职后,公司会给他安排入职培训,介绍公司的规章制度、岗位相关的知识和工具等。对于 Spring Bean 来说,就是把配置文件或者注解中定义的属性值注入到 Bean 实例中。比如张三入职程序员岗位后,公司给他配备电脑、开发工具等,Spring 也会给 Bean 注入它所依赖的其他对象和属性值。

3. 了解公司环境(实现 Aware 接口)

员工入职一段时间后,会逐渐了解公司的各种环境和资源。如果 Bean 实现了 Aware 系列接口,Spring 会调用相应的方法,让 Bean 了解容器的相关信息。比如:

  • BeanNameAware:员工知道自己在公司的工号,Bean 能知道自己在 Spring 容器中的名字。
  • BeanFactoryAware:员工了解到公司的组织架构和管理体系,Bean 能获取到创建它的 BeanFactory
  • ApplicationContextAware:员工熟悉公司所在的整个园区环境,Bean 能获取到应用上下文 ApplicationContext

4. 岗前检查(BeanPostProcessor 前置处理 PostProcessBeforeInitialization)

在员工正式上岗前,公司可能会对员工进行一次全面的检查,看看员工是否符合岗位要求,是否还需要做一些调整。对于 Bean 来说,Spring 会调用 BeanPostProcessor 的 postProcessBeforeInitialization 方法,在 Bean 初始化之前对它进行额外的处理。例如,检查 Bean 的属性是否符合要求,或者对 Bean 进行一些修改。

5. 正式培训与考核(初始化 Initialization)

员工正式开始参加岗位培训,学习工作技能,培训结束后会进行考核。Bean 的初始化也有两种方式:

  • 实现 InitializingBean 接口:员工按照公司的标准流程完成培训任务,通过考核。如果 Bean 实现了 InitializingBean 接口,Spring 会调用它的 afterPropertiesSet 方法,在这个方法里可以编写一些初始化的逻辑,比如建立数据库连接等。
  • 自定义初始化方法:员工自己有一套独特的学习方法,也能达到培训的效果。你可以在 Bean 定义中指定一个自定义的初始化方法,Spring 会在合适的时候调用这个方法。比如使用 @PostConstruct 注解标记的方法。

6. 岗位评估(BeanPostProcessor 后置处理 PostProcessAfterInitialization)

员工经过培训和考核后,公司会对员工在岗位上的表现进行评估,看看是否需要进一步的调整或者提升。对于 Bean 来说,Spring 会调用 BeanPostProcessor 的 postProcessAfterInitialization 方法,在 Bean 初始化之后对它进行额外的处理。例如,为 Bean 创建代理对象,增强 Bean 的功能。

7. 正式工作(使用 Bean)

员工通过了前面的所有流程,就正式开始在岗位上工作,为公司创造价值。对于 Bean 来说,它已经完成了初始化等一系列操作,可以被 Spring 应用中的其他组件使用了。其他组件通过依赖注入的方式获取这个 Bean,就像其他部门可以调用这名员工来完成工作任务。

8. 离职处理(销毁 Destruction)

当员工决定离开公司时,需要办理离职手续,交接工作,归还公司的物品等。当 Spring 容器关闭时,也会对需要销毁的 Bean 进行处理,同样有两种方式:

  • 实现 DisposableBean 接口:员工按照公司的离职流程,完成各项交接工作。如果 Bean 实现了 DisposableBean 接口,Spring 会调用它的 destroy 方法,在这个方法里可以编写一些资源释放的逻辑,比如关闭数据库连接、释放文件资源等。
  • 自定义销毁方法:员工有自己的方式来完成离职交接。你可以在 Bean 定义中指定一个自定义的销毁方法,Spring 会在容器关闭时调用这个方法。比如使用 @PreDestroy 注解标记的方法。

综上所述,Spring Bean 的生命周期就是从创建、准备、初始化、使用到销毁的一个完整过程,每个阶段都有其特定的任务和作用。


http://www.ppmy.cn/server/169426.html

相关文章

ib网络状态探测

在 InfiniBand 网络中,Host Channel Adapter(HCA)是关键组件,了解其状态和配置对于网络管理和故障排查至关重要。以下是一些常用的命令,用于查询和管理 HCA 的状态和配置。 常用命令 ibstat 功能:显示 HCA…

webpack和vite打包原理及比较

Webpack 和 Vite 是前端领域两种主流的构建工具,它们在设计理念、打包机制和适用场景上有显著差异。以下是它们的详细原理及对比分析: 一、Webpack 的打包原理 1. 核心机制 模块化与依赖解析 Webpack 将所有文件(JS、CSS、图片等&#xff0…

NVIDIA 开发者社区第十一届Sky Hackathon训练营实验手册---AWS Sagemaker AI部分

NVIDIA 开发者社区第十一届Sky Hackathon训练营实验手册 第一部分 Sagemaker实验手册 在这部分实验中,我们将利用AWS Sagemaker下载并部署NIM。 以下是实验步骤: 1. 登录实验平台 利用浏览器,访问下面的地址,打开AWS的控制台网…

在Kubernetes上部署DeepSeek-R1进行高效AI推理

在本篇文章中,我们将介绍如何使用亚马逊云科技的Kubernetes服务Amazon EKS Auto Mode,在亚马逊云科技上部署DeepSeek模型。Amazon EKS Auto Mode提供了更强的灵活性和可扩展性,同时无需管理Kubernetes控制节点、计算、存储和网络组件&#xf…

全功能Python测试框架:pytest

python通用测试框架大多数人用的是unittestHTMLTestRunner,这段时间看到了pytest文档,发现这个框架和丰富的plugins很好用,所以来学习下pytest. pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点: …

23种设计模式 - 适配器模式

模式定义 适配器模式(Adapter Pattern)是一种结构型设计模式,用于解决接口不兼容问题。它通过将一个类的接口转换为客户端期望的接口,使原本因接口不匹配而无法协同工作的类能够协同工作。适配器模式分为类适配器(通过…

el与data的2种写法

el的2种写法 1.el: #root, <div id"root"> </div><script type"text/javascript">const x new Vue({el: #root,data: {name: 伏尔加}})</script> 2. x.$mount(#root) <div id"root"> </div><script …

Python 自然语言处理(NLP)和文本挖掘的常规操作过程

Python 自然语言处理&#xff08;NLP&#xff09;和文本挖掘 自然语言处理&#xff08;NLP&#xff09;和文本挖掘是数据科学中的重要领域&#xff0c;涉及对文本数据的分析和处理。Python 提供了丰富的库和工具&#xff0c;用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…