Spring Bean的作用域和生命周期

在 Spring 框架中,Bean 是用于管理对象的核心组成部分。Spring 的 IoC 容器通过 Bean 的作用域来控制它们的生命周期。理解 Spring Bean 的作用域和生命周期对于开发灵活、高效的 Spring 应用至关重要。


Spring Bean 的五种作用域

Spring 提供了五种 Bean 作用域,每种作用域决定了 Bean 的创建、使用和销毁方式:

  1. singleton(单例,默认作用域)

    • 定义:整个 Spring IoC 容器中,只有一个实例。
    • 生命周期:容器启动时创建 Bean,关闭时销毁;Bean 被共享,因此每次引用时返回的都是同一实例。
    • 适用场景:适合无状态的 Bean,比如 DAO 类、Service 类等。
    • 声明方式@Scope("singleton") 或不显式声明作用域(默认为 singleton)。
  2. prototype(原型)

    • 定义:每次请求 Bean 时都会创建一个新的实例。
    • 生命周期:由调用方管理,Spring IoC 容器不负责销毁;调用 getBean 方法时创建新实例。
    • 适用场景:适合需要频繁创建的、带有状态的 Bean。
    • 声明方式@Scope("prototype")
  3. request(Web 应用中的请求作用域)

    • 定义:每个 HTTP 请求都会创建一个新的 Bean 实例,生命周期与请求一致。
    • 生命周期:请求开始时创建,结束时销毁;只在 Web 环境中有效。
    • 适用场景:适合与单个 HTTP 请求相关的数据处理 Bean。
    • 声明方式@Scope("request")
  4. session(Web 应用中的会话作用域)

    • 定义:每个 HTTP 会话对应一个 Bean 实例,生命周期与会话一致。
    • 生命周期:会话开始时创建,会话失效时销毁;只在 Web 环境中有效。
    • 适用场景:适合与单个用户会话相关的数据处理 Bean。
    • 声明方式@Scope("session")
  5. application(Web 应用中的全局作用域)

    • 定义:Bean 的生命周期与 ServletContext 一致,在整个 Web 应用中共享。
    • 生命周期:Web 应用启动时创建,关闭时销毁。
    • 适用场景:适合在整个应用中共享的 Bean。
    • 声明方式@Scope("application")

Spring Bean 的生命周期

在这里插入图片描述

Spring Bean 的生命周期涉及从创建到销毁的整个过程,主要分为以下几个步骤:

  1. 实例化(Instantiation):Spring 根据配置(XML 配置或注解配置)创建 Bean 的实例。

  2. 属性注入(Dependency Injection):Spring 使用构造方法或 setter 方法将依赖对象注入到 Bean 中。

  3. 实现 BeanNameAware 接口(可选):如果 Bean 实现了 BeanNameAware 接口,则会调用 setBeanName() 方法,并传入该 Bean 的名称。

  4. 实现 BeanFactoryAware 接口(可选):如果 Bean 实现了 BeanFactoryAware 接口,则会调用 setBeanFactory() 方法,并传入 BeanFactory 实例。

  5. 实现 ApplicationContextAware 接口(可选):如果 Bean 实现了 ApplicationContextAware 接口,则会调用 setApplicationContext() 方法,并传入 ApplicationContext 实例。

  6. Bean 的初始化方法

    • @PostConstruct 注解:在 @PostConstruct 方法中可以编写初始化逻辑。
    • InitializingBean 接口:如果实现了 InitializingBean 接口,则会调用其 afterPropertiesSet() 方法。
    • init-method 属性:在 XML 配置中指定的 init-method 也会在此阶段调用。
  7. Bean 的就绪状态:初始化完成后,Bean 进入就绪状态,可供应用程序使用。此阶段,单例作用域的 Bean 将被放入 IoC 容器中以供共享。

  8. Bean 的销毁方法

    • @PreDestroy 注解:在 @PreDestroy 方法中编写销毁逻辑。
    • DisposableBean 接口:如果实现了 DisposableBean 接口,则会调用其 destroy() 方法。
    • destroy-method 属性:在 XML 配置中指定的 destroy-method 也会在此阶段调用。

在使用原型作用域的 Bean 时,Spring 只管理 Bean 的初始化过程,不负责销毁。如果需要销毁逻辑,则需要由应用程序自行管理。


Bean 生命周期示例

以下是一个定义了初始化和销毁方法的单例 Bean 示例:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import org.springframework.stereotype.Component;@Component
public class ExampleBean {public ExampleBean() {System.out.println("Bean 实例化");}@PostConstructpublic void init() {System.out.println("Bean 初始化");}public void performTask() {System.out.println("执行任务");}@PreDestroypublic void destroy() {System.out.println("Bean 销毁");}
}

Spring 启动后,输出结果如下:

Bean 实例化
Bean 初始化
执行任务
Bean 销毁

总结

  • 作用域:Spring Bean 的作用域决定了它的实例化方式和生命周期。默认的 singleton 作用域适用于大多数无状态 Bean,而 prototype 和其他 Web 作用域适用于带有状态的数据 Bean。

  • 生命周期:Spring Bean 生命周期包含了实例化、属性注入、初始化和销毁等阶段,开发者可以通过实现特定接口或注解在这些阶段执行自定义逻辑。

了解作用域和生命周期可以帮助我们更好地控制 Bean 的使用方式,避免资源浪费和不必要的状态共享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/6482.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 配置JDK

文章目录 一、下载Oracle-JDK1.1、如何正确的下载JDK二、配置JDK环境变量2.1 环境变量配置2.1.1、修改vim /etc/profile 添加jdk的路径一、下载Oracle-JDK 1.1、如何正确的下载JDK 首先我要安装的是oracle-jdk,这个时候什么地方都不要去,就去oracle的官网,然后找到,jdk的下…

adb 常用命令汇总

目录 adb 常用命令 1、显示已连接的设备列表 2、进入设备 3、安装 APK 文件到设备 4、卸载指定包名的应用 5、从设备中复制文件到本地 6、将本地文件复制到设备 7、查看设备日志信息 8、重启设备 9、截取设备屏幕截图 10、屏幕分辨率 11、屏幕密度 12、显示设备的…

人工智能技术:未来生活的“魔法师”

想象一下,未来的某一天,你醒来时,智能助手已经为你准备好了早餐,你的智能家居系统根据你的心情和日程安排调整了室内的光线和音乐,而你的自动驾驶汽车已经在门口等你。这不是科幻小说,这是人工智能技术为我…

JavaWeb

一,JavaWeb JavaWeb就是用Java技术来解决相关web互联网领域的技术。 软件架构模式: 1.BS模式:browser server 浏览器服务器 优点:只需要开发服务器代码,用户下载浏览器,维护方便;减少用户的磁盘空间 缺…

【C++笔记】模版的特化及其编译分离

【C笔记】模版的特化及其编译分离 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】模版的特化及其编译分离前言一.模版1.1非类型模板参数 二.模板的特化2.1特化的定义2.2 函数模板特化2.3底层const2.4 类模板特化 三…

解决:无法在此设备上激活Windows因为无法连接到你的组织的激活服务器

问题: 桌面右下角会出现这个东西👇 在设置里查看激活状态就会看到👇 解决方法 : 1.打开CMD 搜索CMD,然后以管理员身份运行 2.设置 KMS服务器 1)命令行输入: slmgr /skms kms.03k.org 然后…

1.6K+ Star!GenAIScript:一个可自动化的GenAI脚本环境

GenAIScript 简介 GenAIScript[1] 是一个 JavaScript-ish 环境,提供了便捷的工具用于文件摄入、提示开发和结构化数据提取。它允许用户以编程方式组装大型语言模型(LLM)的提示,并通过单一脚本协调 LLM、工具和数据。 项目特点 主…

高效管理iPhone存储:苹果手机怎么删除相似照片

在使用iPhone的过程中,我们经常会遇到存储空间不足的问题,尤其是当相册中充满了大量相似照片时。这些照片不仅占用了宝贵的存储空间,还可能使iPhone出现运行卡顿的情况。因此,我们迫切需要寻找苹果手机怎么删除相似照片的方法&…

TARE-PLANNER学习记录

参考: CMU-TARE 探索算法官方社区问答汇总_cmu localplanner 部署-CSDN博客 Tare_planner学习笔记_tare planner-CSDN博客 Tare_planner 学习教程(二)_tareplanner-CSDN博客 (学习笔记)机器人自主导航从零开始第七步——TARE Planner自主…

Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载

Moonshine 是由 Useful Sensors 公司推出的一系列「语音到文本(speech-to-text, STT)转换模型」,旨在为资源受限设备提供快速而准确的「自动语音识别(ASR)服务」。Moonshine 的设计特别适合于需要即时响应的应用场景&a…

【实验八】前馈神经网络(4)优化问题

1 参数初始化 模型构建 模型训练 优化 完整代码 2 梯度消失问题 模型构建 模型训练 完整代码 3 死亡Relu问题 模型构建 模型训练 优化 完整代码 1 参数初始化 实现一个神经网络前,需要先初始化模型参数。如果对每一层的权重和偏置都用0初始化&#xff0…

华为-宝塔-MongoDB无法登录

1、宝塔防火墙服务器安全组放开端口号 2、用数据库对应的用户名和密码登录 2-1:不指定验证数据库时用root账号密码登录 2-2:如果设置了验证数据库就用验证数据库对应的账号和密码登录

Scala入门基础(16)scala的包

Scala的包定义包定义包对象Scala的包的导入导入重命名 一.Scala的包 package(包:一个容器。可以把类,对象,包,装入。 好处: 区分同名的类;类很多时,更好地管理类;控制…

Android IPC机制(一)多进程模式

1. 什么是进程? 进程是操作系统分配资源(如 CPU、内存等)的基本单位。简单来说,进程是一个正在执行的程序的实例。每个进程都有自己的内存空间、数据栈和其他辅助数据,用于跟踪进程的执行状态。在 Android 中&#xff…

【笔记】铜导线在高频下的损耗

参考资料:Litz Wire: Practical Design Considerations for Todays High Frequency Applications,kyle jensen,2020 1.高频条件下因为集肤效应,需要选择多股线 否则高频下因为集肤效应和接近效应,所引发的交流阻抗上升&#xff…

火语言RPA流程组件介绍--指纹浏览器管理

🚩【组件功能】:指纹浏览器配置管理创建、删除、判断是否存在 配置预览 配置说明 操作类型 有“创建、删除、判断是否存在”3种类型供选择。 指纹浏览器配置名称 支持T或# 默认FLOW输入项 填写指纹环境分身名称。 操作方式 有“名称、Id”2种方式…

windows自启动 映像劫持 屏保

Windows权限维持—自启动&映像劫持&粘滞键&辅助屏保后门 自启动 自启动路径加载 受控windows机器选择当前用户C盘目录下将文件放到这里每到电脑服务器重启就会自动加这次路径下文件 C:\Users\月\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startu…

SSH实验3拒绝root用户远程登录

打开配置文件: 默认为root用户密码登录: 加一行PermitRootLogin no,拒绝登录: 再打开这个配置文件: yes改为no: 查看SELinux 当前处于宽松模式,并且关闭防火墙: 重启sshd&#xff1a…

mysql 主从复制

一、通过二进制文件binlog进行主从同步 开启防火墙3306端口 1.设置主服务器:/etc/my.cnf log-binbinlog #二进制文件名称,需要开启 binlog-formatROW; # row,statement,mixed mysql默认采用statement statement:主要记录了sql。日志…

Python作业记录

复制过来的代码的换行有问题,但是也不是什么大问题。 后续我会进行补充和修改。 请将如下英文短句根据单词切分成列表: The continent of Antarctica is rising. It is due to a geological phenomenon called post-glacial uplift 并在切分好的列表…