Spring中Bean的生命 周期与作用域

news2025/3/14 20:19:59

文章目录

  • 前言
  • Bean的作用域概念
    • Bean作用域类型
      • 1. singleton:单例作⽤域
      • 2. prototype:原型作⽤域(多例作⽤域)
      • 3. request:请求作⽤域
      • 4. session:回话作⽤域
      • 5. application:全局作⽤域
      • 6. websocket:HTTP WebSocket 作⽤域
    • 总结
    • 使用作用域
  • Spring的执行流程
  • Bean ⽣命周期


前言

上文讲了, Spring有关注解的一些处理方式, 那这篇博客将注重讲述 ,Spring中 , Bean对象的生命周期与作用域

Bean的作用域概念

首先, 要明白一个基础概念 ,单例模式
单例模式 :单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象
总结 : 单例模式可以理解为在整个程序运行期间,对这个类进行修改, 将会改变整体这个类的值, 以后访问这个类的值也变了.

而Bean对象在默认情况下就是单例模式 , 单例模式有个好处就是可以提高性能 ,所以在Spring中默认情况下就是单例模式!

Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式,⽐如 singleton 单例作⽤域,就表示 Bean 在整个 Spring 中只有⼀份,它是全局共享的,那么当其他⼈修改了这个值之后,那么另⼀个⼈读取到的就是被修改的值。

Bean作用域类型

Spring有 6 种作⽤域,最后四种是基于 Spring MVC ⽣效的:在普通的 Spring 项⽬中只有前两种

1. singleton:单例作⽤域

应用场景:Bean对象的属性状态不需要更新
注:Spring默认选择该作⽤域
作用: 该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀个对

2. prototype:原型作⽤域(多例作⽤域)

使用场景 : 当Bean对象的属性状态需要更新时
作用 : 每次对该作用域下的Bean对象进行操作的时候 , 都会请求创建一个新的实例, 获取Bean(即通过applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是新的对象
实例

3. request:请求作⽤域

应用场景:⼀次http的请求和响应的共享Bean
描述:每次http请求会创建新的Bean实例,类似于prototype
注:限定SpringMVC中使⽤

4. session:回话作⽤域

场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息
描述:在⼀个http session中,共享⼀个Bean实例
注:限定SpringMVC中使⽤

5. application:全局作⽤域

场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息
描述:在⼀个http servlet Context中,定义⼀个Bean实例
注:限定SpringMVC中使⽤

6. websocket:HTTP WebSocket 作⽤域

场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀
次初始化后,直到WebSocket结束都是同⼀个Bean。
描述:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
注:限定Spring WebSocket中使⽤

总结

上面, 可以看到作用域的范围是越来越大的 ,而单例模式的作用域 看起来和全局作用域很像 ,那他俩的区别在哪里?
①singleton 是 Spring 的作⽤域;application 是 Spring Web 中的作⽤域;
②singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。

使用作用域

使⽤ @Scope 标签就可以⽤来声明 Bean 的作⽤域,⽐如设置 Bean 的作⽤域,如下代码所示
@Scope 标签既可以修饰⽅法也可以修饰类,@Scope 有两种设置⽅式:

  1. 直接设置值:

@Scope(“prototype”)

  1. 使⽤枚举设置:

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
public class Users {
	 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
	 @Bean(name = "u1")
	 public User user1() {
		 User user = new User();
		 user.setId(1);
		 user.setName("Java"); // 【重点:名称是 Java】
		 return user;
	 }
}

Spring的执行流程

① 启动容器 , 加载配置文件(类加载下面的XML文件)
在这里插入图片描述
②根据配置完成初始化
在这里插入图片描述
③ 扫描给定的包路径中的类(添加了五大类注解的)

④ 将扫描到的对象注入到容器中
在这里插入图片描述

⑤装配Bean的属性 - 通过@Autowired 与@Resource
在这里插入图片描述

Bean ⽣命周期

所谓的⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,我们把这个过程就叫做⼀个对象的⽣命周期
而Bean的生命周期 ,大体上可以分为这5个部分
1.实例化 Bean(为 Bean 分配内存空间)
2.设置属性(Bean 注⼊和装配 ,@Autowired等)
3.Bean 初始化(实现各种通知方法)
4.使⽤ Bean
5.销毁 Bean

这里简单说一下 实例化和初始化的区别
实例化 : 就是将一个对象创造出来 ,初始化就是给这个对象附上各种属性值
这里在说明一下 , 生命周期 2 ,3 步骤不能相换 , 原因是: 使用依赖注入是动态的 , 也就是说执行了步骤2 之后 ,在执行步骤3, 一定是可以避免空指针异常的 , 但是如果先执行步骤3的话,就很可能出现空指针异常, 因为属性你并没有给他赋值, 而是使用系统的默认值

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

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

相关文章

51单片机实训项目之“红外控制小风扇”代码详解

本代码实现的功能是通过红外遥控来控制风扇的转速。废话不多说,直接上代码。 另外补充一点红外通信的原理: 红外接收 NEC协议: 数据格式 发射端的方波图,接收端的正好与之相反,数据传输从最低位开始 NEC 标准下…

mqtt.fx连接阿里云物联网平台

这里写目录标题 注册公共示例创建产品添加设备创建云产品流转生成基本信息配置mqtt.fx客户端数据传送 前提条件:下载mqtt.fx软件,以及注册好阿里云物联网平台账号 本实验用两个mqtt.fx客户端接入阿里云物联网平台,来实现不同设备间消息的传输…

大数据Doris(四十):Routine Load基本原理和语法介绍

文章目录 Routine Load基本原理和语法介绍 一、基本原理 二、Routine Load 语法 Routine Load基本原理和语法介绍 例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 Doris 中。目前Rou

chatgpt赋能python:如何使用Python获取Listview

如何使用Python获取Listview 在现代数据驱动的世界中,处理大量数据已经成为一项关键技能。准确地说,操作大量数据要比操作一小部分数据要困难得多。Python是一门非常出色的编程语言,它的处理大量数据的能力无人能敌。在这篇文章中&#xff0…

MySQL面试题详解

优化 如何定位慢查询 mysql中慢查询通常发生在以下几种情况,聚合查询,多表查询,表数据量过大查询,深度分页查询。 表象:页面加载过慢,接口压测响应时间过长(超过1s) 定位慢查询的方法主要有两种。方法一…

Windows 下编译 OpenCV 和 OpenCV-contrib

文章目录 导言环境准备源码获取环境获取 配置 CMake 并编译ConfigureGenerate 生成项目总结 导言 在本文中,我们将介绍如何在 Windows 系统下编译 OpenCV 和 OpenCV-contrib。OpenCV 是一个开源的计算机视觉库,它包含了许多图像处理和计算机视觉的功能。…

gismo调试-组总刚

文章目录 前言一、1 组总刚main文件的断点2 跳转到gsElasticityAssembler.hpp3 gsElasticityAssembler.hpp的177行进入gsVisitorLinearElasticity.h4 进入gsAssembler.h重新进入gsVisitorLinearElasticity.h进入gsSparseSystem.h1.14 进入gsAssembler.h1.21.31.4 二、2.12.22.3…

Cracking C++(11): CMake代码高亮调研

文章目录 1. 目的2. VSCode 插件CMake 和 CMake ToolsCMake Language SupportCMake Highlights 3. JetBrains 系列3.1 CLion3.2 Fleet 4. Kate5. Sublime Text6. 总结 1. 目的 CMake 已经是开源 C 项目的主流 building system, 这里简单调研关注的编辑器 / IDE 下&…

Jetson nano 进阶教程4_通过IIC输出PWM

Jetson nano 进阶教程4_通过IIC输出PWM Jetson nano的40PIN不能直接发出PWM波,在很多控制舵机,电机调速方面很不方便,因此利用一块PCA9685模块,通过I2C总线控制PCA9685输出pwm波,并且可以调整占空比。 How do I use P…

Android Activity启动过程详解

目录 一,背景介绍 二,Activity启动过程 2.1 调用 ATMS 系统进程 2.1.1 时序图 2.1.2 Launcher 桌面的 App 图标入口 2.1.3 startActivitySafely() 方法 2.1.4 execStartActivity() 方法 2.2 ATMS 向 AMS 发送创建应用进程的过程 2.2.1 时序图 …

03- 流程控制(C语言)

一 概述 C语言支持三种程序运行结构:顺序结构、选择结构、循环结构。 顺序结构:按照语句编写的顺序 上到下逐句执行。选择结构:也叫 分支结构,依据是否满足条件,有选择的执行相应功能。循环结构:依据条件…

动态字符串SDS

基本概括 Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 但Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题(C语言中实际上没有字符串,本质上是字符数…

面向对象的封装

9. 面向对象特征一:封装性(encapsulation) 什么是封装 就像快递一样我们在网上买的物品,快递都会给我们添加外包装,给我们封装起来,这就是封装 客观世界里每一个事物的内部信息都隐藏在其内部,外界无法直接操作和修改…

怎样才算一个计算机知识体系完整的毕业生

为什么突然想写这个话题呢? 最近有不少新关注的读者,在后台问:大学学 Java 和 C 哪个好找工作,学前端好还是后端好,该学 Vue 还是 React。。。 仿佛看到了自己当年的模样,所以觉得有必要单独写一篇文章&a…

CSS基础学习--8 盒子模型(Box Model)

一、介绍 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实…

调用阿里API实现图片中的文字识别

作者介绍 王雪玉,女,西安工程大学电子信息学院,2022级研究生 研究方向:机器视觉与人工智能 电子邮件:2239580540qq.com 王泽宇,男,西安工程大学电子信息学院,2022级研究生&#xf…

网规例题(二)

解题思路: 1.发送150000字节大小IP报文 数据帧长1518字节 首部18字节 可用数据1500字节 因此需要发送 100个数据帧 1518字节 1518*8 bit 带宽10 Mb/s 10 000 000 bps (一)发送100个数据帧的发送时延 0.12144 秒 (二&#…

Java程序员不得不知道的一些设计模式

1、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢…

【arXiv2303】Learning with Explicit Shape Priors for Medical Image Segmentation

Learning with Explicit Shape Priors for Medical Image Segmentation, aXiv2303 解读:SPM: 一种即插即用的形状先验模块,可轻松嵌入任意编解码架构,助力涨点并显著改善分割效果! (qq.com) 论文:https://arxiv.org/…

基于Air103的DAP-link的硬件介绍

原文及固件链接 视频介绍链接 xkb7070-z 自锁式按键 上电开关 WAFER-SH1.0-6PWB 1.0间距卧贴插座 下载及通信接口 A2-4PA-2.54DS 4Pin接插件 纯下载接口 Air32F103CBT6 lqfp48 216MHz 256K Flash 32K RAM UD/UD- DP&DM信号 USB的差信号 R1 DIO监听 限流 PM254-2-04-W…