当前位置: 首页 > 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…...

用PyQt5打造GUI应用:PyCharm中QtDesigner和PyUic的高效工作流配置

PyCharm专业版中PyQt5高效开发&#xff1a;QtDesigner与PyUic深度整合指南 在Python GUI开发领域&#xff0c;PyQt5凭借其强大的功能和跨平台特性&#xff0c;已成为众多开发者的首选工具。然而&#xff0c;许多中级开发者在实际项目中常遇到工作流断裂的问题——设计界面与代码…...

深入解析XSpiPs_PolledTransfer与XSpiPs_Transfer的片选信号行为差异

1. 从波形图看片选信号的关键差异 第一次用逻辑分析仪抓取SPI波形时&#xff0c;我被XSpiPs_PolledTransfer和XSpiPs_Transfer的片选信号差异惊到了。同样是发送两个字节的数据&#xff0c;前者像老式电报机一样稳定保持CS低电平&#xff0c;后者却像发摩尔斯电码似地频繁跳变。…...

Krita AI Diffusion终极指南:从零开始掌握AI绘画插件

Krita AI Diffusion终极指南&#xff1a;从零开始掌握AI绘画插件 【免费下载链接】krita-ai-diffusion Streamlined interface for generating images with AI in Krita. Inpaint and outpaint with optional text prompt, no tweaking required. 项目地址: https://gitcode.…...

3分钟快速破解:百度网盘提取码智能获取工具终极指南

3分钟快速破解&#xff1a;百度网盘提取码智能获取工具终极指南 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘分享链接的提取码而烦恼吗&#xff1f;每次遇到加密资源都要手动搜索&#xff0c;既耗时又低效。…...

SQL Server导入导出向导报错终极指南:从驱动安装到版本兼容性全解析

SQL Server数据迁移全链路排错手册&#xff1a;从驱动配置到跨版本适配实战 当你第5次看到"未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序"的红色报错框时&#xff0c;是否想过这背后隐藏着SQL Server数据迁移的完整知识体系&#xff1f;数据工程师老张最近…...

微信小程序对接实战:快速开发集成通义千问1.5-1.8B模型的AI聊天应用

微信小程序对接实战&#xff1a;快速开发集成通义千问1.5-1.8B模型的AI聊天应用 你是不是也想过&#xff0c;给自己的微信小程序加上一个智能聊天助手&#xff1f;比如&#xff0c;做一个能解答用户问题的客服机器人&#xff0c;或者一个能陪你闲聊、帮你写文案的创意伙伴。听…...

如何实现Archery复杂SQL审核表单的分步提交与智能验证:完整指南

如何实现Archery复杂SQL审核表单的分步提交与智能验证&#xff1a;完整指南 【免费下载链接】Archery SQL 审核查询平台 项目地址: https://gitcode.com/gh_mirrors/ar/Archery Archery作为一款专业的SQL审核查询平台&#xff0c;其前端表单设计采用了先进的分步提交与智…...

终极指南:At.js如何让你的应用拥有GitHub级别的智能补全功能

终极指南&#xff1a;At.js如何让你的应用拥有GitHub级别的智能补全功能 【免费下载链接】At.js Add Github like mentions autocomplete to your application. 项目地址: https://gitcode.com/gh_mirrors/at/At.js At.js是一款强大的智能补全库&#xff0c;能够为你的W…...

别再折腾Docker了!用CasaOS在Ubuntu上5分钟搞定个人轻NAS(附国内源配置)

别再折腾Docker了&#xff01;用CasaOS在Ubuntu上5分钟搞定个人轻NAS&#xff08;附国内源配置&#xff09; 你是否曾经被Docker复杂的配置流程劝退&#xff1f;或者对传统NAS系统如TrueNAS的庞大资源占用感到头疼&#xff1f;如果你手头有一台闲置的旧电脑或树莓派&#xff0c…...

LeetCode 二叉搜索树双神题通关!有序数组转平衡 BST + 验证 BST,小白递归一把梭

前言 二叉搜索树&#xff08;BST&#xff09;是算法刷题的高频必考知识点&#xff01;今天给大家带来两道最经典、最基础的 BST 题目&#xff0c;全程用最简单的递归实现&#xff0c;代码干净、思路直白&#xff0c;不用死记硬背&#xff0c;看完就能直接写&#xff01; 一道教…...