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

Bean 的作用域和生命周期

目录

  • 什么是 Bean 的作用域 ?
  • Bean 的六种作用域
  • Spring 的执行流程
  • Bean 的生命周期

什么是 Bean 的作用域 ?

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

它的概念与我们之前学的作用域不一样,之前是指变量的可⽤范围叫做作⽤域。

Bean 的六种作用域

  1. singleton:单例作用域(默认的作用域,线程不安全)
    说明:该作⽤域下的 Bean 在 IoC 容器中只存在⼀个实例:获取 Bean 及装配 Bean 都是同⼀个对

    场景:通常⽆状态的 Bean 使⽤该作⽤域。⽆状态表示 Bean 对象的属性状态不需要更新
    (无状态的 bean:只有普通的对数据的操作方法,没有存储功能)
  1. prototype:原型(多例)作用域 (线程安全)
    说明:每次对该作⽤域下的 Bean 的请求都会创建新的实例:获取 Bean 及装配 Bean 都是新的对象
    实例
    场景:通常有状态的Bean使⽤该作⽤域
  1. request:请求作用域
    说明:每次http请求会创建新的Bean实例,类似于prototype
    场景:⼀次http的请求和响应的共享Bean
    备注:限定SpringMVC中使⽤
  1. session:会话作用域
    说明:在⼀个http session中,定义⼀个Bean实例
    场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息
    备注:限定SpringMVC中使⽤
  1. application:应用作用域(了解)
    说明:在⼀个http servlet Context中,定义⼀个Bean实例
    场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息
    备注:限定SpringMVC中使⽤
  1. websocket(了解)
    说明:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例
    场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀
    次初始化后,直到WebSocket结束都是同⼀个Bean
    备注:限定Spring WebSocket中使⽤

注意:普通的 Spring 项⽬中只有前两种,后 4 种状态是 Spring MVC 中的。

两种设置多例作用域方法:
@Scope(“prototype”)
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

检验默认作用域是否为单例作用域:

User 类:

public class User {private String name;private int id;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getId() {return id;}public void setId(int id) {this.id = id;}
}

Users 类(存储公共对象):

@Service
public class Users {@Beanpublic User getUser(){User user = new User();user.setId(888);user.setName("张三");return user;}
}

取对象的两大类:

@Controller
public class UserController1 {@Autowiredprivate User user;public void doMethod() {System.out.println("修改前的名字: " + user.getName());user.setName("王五");System.out.println("修改后的名字: " + user.getName());}
}
@Controller
public class UserController2 {@Autowiredprivate User user;public void doMethod() {System.out.println("UserController2 拿到的名字: " + user.getName());}
}

启动类:

public class App {public static void main(String[] args) {ApplicationContext context =new ClassPathXmlApplicationContext("spring-config.xml");UserController1 userController1 =context.getBean("userController1",UserController1.class);userController1.doMethod();UserController2 userController2 =context.getBean("userController2",UserController2.class);userController2.doMethod();}
}

输出:
在这里插入图片描述
可以看到张三这个名字被改后,后续再取这个 Bean 就拿不到张三了。

设置多例作用域:

@Service
public class Users {@Scope("prototype")@Beanpublic User getUser(){User user = new User();user.setId(888);user.setName("张三");return user;}
}

在这里插入图片描述
这里拿到的每个 Bean 对象都是 new 了一个新的,不是直接拿容器中原有的对象。

Spring 的执行流程

  1. 启动容器
  2. 读取配置进行 Bean 的实例化(分配内存空间,从无到有)
  3. 将 Bean 加入到容器中(存操作)
  4. 装配 Bean 属性(取操作)

Bean 的生命周期

⽣命周期指的是⼀个对象从诞⽣到销毁的整个⽣命过程,Bean 的生命周期分为下面五个部分:

  1. 实例化(内存空间分配)
  2. 设置 Bean 属性(进行依赖注入,将依赖的 Bean 赋值到当前类属性上)
  3. Bean 的初始化
    3.1 执行各种通知
    3.2 初始化的前置方法
    3.3 初始化方法
    3.4 初始化的后置方法
  4. 使用 Bean
  5. 销毁 Bean

实例化和初始化的区别:
实例化和属性设置是 Java 级别的系统“事件”,其操作过程不可⼈⼯⼲预和修改;⽽初始化是给开发者提供的,可以在实例化之后,类加载完成之前进⾏⾃定义“事件”处理

相关文章:

Bean 的作用域和生命周期

目录 什么是 Bean 的作用域 ?Bean 的六种作用域Spring 的执行流程Bean 的生命周期 什么是 Bean 的作用域 ? Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式,⽐如 singleton 单例作⽤域,就表示 Bean 在整个 Spring 中只有⼀份&#xff0c…...

STP和MTP(第二十二课)

2、如何实现 1)在MSTP网络种,引入了域的概念,称为MST域 2)每一个MST域中包含一个或多个“生成树”称为“实例” 3)每个“实例生成树”都可以绑定vlan,实现vlan数据流的负载分担/负载均衡 4)默认情况下,所有的vlan都属于“实例树0:即:instance 0” 5)不同的“实例…...

Java-WebSocket

请点击下面工程名称,跳转到代码的仓库页面,将工程 下载下来 Demo Code 里有详细的注释 TestWebSocket...

elementui的el-date-picker选择日期范围第二个不能早于第一个

选择日期范围第二个不能早于第一个 <el-form-item label"预计施工时间:" required><el-form:model"form":rules"constructionDateRules"ref"constructionRef"inline:hide-required-asterisk"false"><el-form…...

【NLP】无服务器问答系统

一、说明 在NLP的眼见的应用&#xff0c;就是在“ 当你在谷歌上提出一个问题并立即得到答案时会发生什么&#xff1f;例如&#xff0c;如果我们在谷歌搜索中询问谁是美国总统&#xff0c;我们会得到以下回答&#xff1a;Joe Biden&#xff1b;这是一个搜索问题&#xff0c;同时…...

Dubbo

Dubbo 简介Dubbo的快速入门Dubbo的基本架构安装DubboAdmin入门案例Dubbo的最佳实践 Dubbo的高级特性启动检查多版本超时与重试负载均衡SpringCloud整合Dubbo案例 简介 Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。 致力于提高性能和透明化的RPC远程服务调用方…...

Java设计模式之策略(Strategy)模式

策略&#xff08;Strategy&#xff09;设计模式定义了一系列算法&#xff0c;将它们封装起来&#xff0c;并且可以相互替换使用&#xff0c;从而使得算法可以独立于使用它的客户而变化。 什么是策略模式 策略&#xff08;Strategy&#xff09;设计模式是一种行为型设计模式&a…...

Vue引入CDN JS或本地JS文件之后 使用报错

加载问题 正常情况 在public引入script - js文件加载 - 写入内存 - 使用 但使用之前 有可能这个文件还没执行写入内存或者还未加载完毕 此时 需要一个promiss解决 1. 引入script 在 public / index.html 文件内引入你的script标签 <script type"text/javascript"…...

NRF52832-扩展广播

nordic论坛 我想要设置广播名称为 “一二三四五”&#xff0c;当广播名称为FULL_NAME时&#xff0c;但是广播显示还是“一&#xff1f;”&#xff0c;“&#xff1f;”是乱码&#xff0c;后来打开nrf connect观察广播&#xff0c;在没连接的时候&#xff0c;点击一下&#xff0…...

springboot项目新增子module

1. 拉取项目 2. file-new-module 3. 选择版本 4. 1-2-3-4 5. 注释请求统一前缀 (SwaggerConfig.java)...

Python Web 开发及 Django 总结

title: Python Web 开发及 Django 总结 date: 2023-07-24 17:26:26 tags: PythonWeb categories:Python cover: https://cover.png feature: false Python 基础部分见&#xff1a;Python 基础总结 1. 创建项目 1.1 命令行 1、下载安装 Django 在终端输入 pip install djan…...

《向量数据库指南》:向量数据库Pinecone故障排除

目录 无法pip安装 空闲后索引丢失 上传缓慢或延迟高 批处理带来的高查询延迟 使用gRPC客户端进行Upsert限流 Pods已满 安全问题 CORS错误 本节介绍常见问题以及如何解决它们。需要帮助吗?在我们的支持论坛中提问。标准、企业和专用客户还可以联系支持人员寻求帮助。...

[86] 分割链表

题目链接&#xff1a;86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09; 第一种方法&#xff1a;类似双指针 自己想的&#xff0c;不知道读者是否能看懂&#xff0c;参考注释 ListNode* partition(ListNode* head, int x) {ListNode* bigpos nullptr;ListNode* littlep…...

【python】 清空socket缓冲区

在Python中使用Socket进行网络通信时&#xff0c;可以通过调用socket.recv()函数来接收数据&#xff0c;数据会被存储在缓冲区中。有时候&#xff0c;可能想要先清空缓冲区&#xff0c;以便后续的数据不会被之前的数据影响。以下是一种清空Python Socket缓冲区的方法&#xff1…...

108、RocketMQ的底层实现原理(不需要长篇大论)

RocketMQ的底层实现原理 RocketMQ由NameServer集群、Producer集群、Consumer集群、Broker集群组成&#xff0c;消息生产和消费的大致原理如下: Broker在启动的时候向所有的NameServer注册&#xff0c;并保持长连接&#xff0c;每30s发送一次心跳Producer在发送消息的时候从Na…...

怎么把PDF转为word?1分钟解决难题

PDF文件在我们的电脑上应用非常广泛&#xff0c;由于其较高的安全性和兼容性&#xff0c;得到了广泛的认可。然而&#xff0c;对于一些人来说&#xff0c;PDF文件不能直接进行编辑和修改可能是一个问题。因此&#xff0c;通常我们需要将其转换为Word格式&#xff0c;以便在Word…...

Mysql权限-系统表user,db,talbes_priv,columns_priv详解

一、MySQL 权限场景 可以根据登录用户限制用户访问资源(库、表)可以根据登录用户限制用户的操作权限(能对哪些库、表执行增删改查操作)可以指定用户登录IP或者域名可以限制用户权限分配 二、Mysql五个层级权限级别分析 Mysql权限级别分为了五个层级&#xff0c;并且每个级别…...

GPT-4 模型详细教程

GPT-4&#xff08;Generative Pretrained Transformer 4&#xff09;是 OpenAI 的最新语言生成模型&#xff0c;其在各类文本生成任务中表现优秀&#xff0c;深受开发者和研究者喜爱。这篇教程将帮助你理解 GPT-4 的基本概念&#xff0c;并向你展示如何使用它来生成文本。 什么…...

智慧环保:创造绿色未来

随着全球环境问题的日益严重&#xff0c;智慧环保成为推动绿色发展的关键。智慧环保利用先进的技术手段和智能化设备&#xff0c;致力于解决环境问题&#xff0c;保护生态环境&#xff0c;实现可持续发展。它融合了物联网、人工智能、大数据等技术&#xff0c;将科技的力量与环…...

虚拟 DOM和render()函数和Vue.js模板语法

[TOC](虚拟 DOM和render()函数) 1. 虚拟DOM 虚拟DOM是Vue中非常重要的概念&#xff0c;它是一个虚拟的内存中的数据结构&#xff0c;用来表示真实的DOM树。Vue使用虚拟DOM来减少对真实DOM的操作次数&#xff0c;从而提高页面的性能。 虚拟DOM的工作原理如下&#xff1a; Vu…...

LTspice2Matlab:如何实现电路仿真数据到MATLAB的无缝迁移终极方案?

LTspice2Matlab&#xff1a;如何实现电路仿真数据到MATLAB的无缝迁移终极方案&#xff1f; 【免费下载链接】ltspice2matlab LTspice2Matlab - Import LTspice data into MATLAB 项目地址: https://gitcode.com/gh_mirrors/lt/ltspice2matlab 电子工程师的数据孤岛困境&…...

3分钟快速上手:使用image2cpp免费在线工具将图像转换为Arduino字节数组

3分钟快速上手&#xff1a;使用image2cpp免费在线工具将图像转换为Arduino字节数组 【免费下载链接】image2cpp 项目地址: https://gitcode.com/gh_mirrors/im/image2cpp image2cpp图像转换工具是嵌入式开发者的得力助手&#xff0c;这个强大的免费在线工具能够将普通图…...

csp信奥赛c++之字符数组与字符串的区别

csp信奥赛c之字符数组与字符串的区别 一、字符数组与字符串的区别&#xff08;详细讲解&#xff09; 在C&#xff08;尤其信奥赛CSP常用环境&#xff09;中&#xff0c;“字符数组”和“字符串”通常指两种不同的数据类型或存储方式&#xff1a; 特性字符数组 (char[])字符串…...

八大网盘直链下载神器:告别客户端依赖,解锁高速下载新体验

八大网盘直链下载神器&#xff1a;告别客户端依赖&#xff0c;解锁高速下载新体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国…...

AI训练数据处理与标签管理:提升标注效率的完整指南

AI训练数据处理与标签管理&#xff1a;提升标注效率的完整指南 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 在AI模型训练过程中&#xff0c;数据质量直接决定模型效果&#xff0c;而标签管理是数据预…...

UABEA:Unity游戏资源编辑与分析的终极解决方案

UABEA&#xff1a;Unity游戏资源编辑与分析的终极解决方案 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 在Unity游戏开发和模组制作领域&#xff0c;处理Asset Bundle资源文件是每个开发者都会面临的…...

OpenClaw智能相册管理:Qwen2.5-VL-7B自动分类与标注私人照片

OpenClaw智能相册管理&#xff1a;Qwen2.5-VL-7B自动分类与标注私人照片 1. 为什么需要智能相册管理&#xff1f; 每次打开手机相册&#xff0c;看到上万张杂乱无章的照片时&#xff0c;那种无力感想必很多人都深有体会。去年夏天&#xff0c;我在整理旅行照片时突然意识到—…...

自媒体好帮手:OpenClaw+千问3.5-27B批量生成视频脚本

自媒体好帮手&#xff1a;OpenClaw千问3.5-27B批量生成视频脚本 1. 为什么需要自动化视频脚本生成 作为一个自媒体创作者&#xff0c;我每天最头疼的就是选题和脚本创作。传统流程需要手动搜索热点、分析数据、撰写大纲、拆解分镜&#xff0c;整个过程耗时耗力。直到我发现Op…...

OpenClaw学术助手:千问3.5-27B自动校对论文格式与参考文献

OpenClaw学术助手&#xff1a;千问3.5-27B自动校对论文格式与参考文献 1. 为什么需要自动化论文校对工具 作为科研工作者&#xff0c;我经历过无数次论文投稿前的格式调整噩梦。记得去年投稿某核心期刊时&#xff0c;光是调整参考文献格式就花了整整两天——期刊要求APA第六版…...

深度学习项目训练环境作品集:10类常见图像分类任务的统一训练模板与结果汇总

深度学习项目训练环境作品集&#xff1a;10类常见图像分类任务的统一训练模板与结果汇总 1. 环境准备与快速上手 深度学习项目训练往往需要复杂的环境配置&#xff0c;从框架安装到依赖库配置&#xff0c;整个过程耗时且容易出错。本镜像基于深度学习项目改进与实战专栏&…...