Bean的作用域和生命周期(上)

简介: Bean的作用域和生命周期(上)

🔎前置


引入 Lombok

  1. 引入 Lombok 相关依赖
  2. 下载 Lombok 插件

利用 Lombok 的注解可自动添加所需的方法

例如

  • @Getter 自动添加 getter 方法
  • @Setter 自动添加 setter 方法
  • @ToString 自动添加 toString 方法
  • @Data 包含上述的所有方法

引入 Lombok 相关依赖


复制如下代码至pom.xml

<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
     <groupId>org.projectlombok</groupId>
     <artifactId>lombok</artifactId>
     <version>1.18.24</version>
     <scope>provided</scope>
 </dependency>

下载 Lombok 插件


如果未找到, 可能的原因是已经下载好了(点击 Installed 查看是否下载)

🔎Bean的6种作用域


什么是作用域?

举个栗子🌰

定义一个成员变量, 该变量的调用范围是整个类(该成员变量的作用域)

定义一个局部变量. 该变量的调用范围是在定义该局部变量的方法内(该局部变量的作用域)

Spring 容器在初始化 Bean 实例时, 同时会指定该实例的作用域

  • singleton, 单例作用域
  • prototype, 原型作用域
  • request, 请求作用域
  • session, 会话作用域
  • application, 全局作用域
  • websocket, HTTP WebSocket 作用域

(前4种较为常见)

Bean 的作用域是指 Bean 在整个 Spring 框架中的某种行为模式

(例如 singleton — 单例作用域, 表示 Bean 在整个 Spring 中只有一份, 是全局共享的, 类似于成员变量)

对Bean作用域的解释


定义 User 类

包含 2 个属性

age — 年龄

name — 名称

定义 UserBeans 类

User user = new User()

设置 user.age 为 18

设置 user.name 为 bibubibu

定义 UserController 类

利用属性注入获取 user

将 user 赋值给 u(User u = user)

设置 u.name = Homo

定义 UserAdviceController 类

利用属性注入获取 user

打印此时的 user

运行结果

结果分析🍂

对于 UserController 类, 利用属性注入获取 user

对于 UserAdviceController 类, 利用属性注入获取 user

分属于不同的类, 但为何在 UserController 类中设置 u.name = Homo, 却在 UserAdviceController 类中获取到的 user 为 Homo 而不是 bibubibu?

因为 Bean 的作用域为全局共享

Bean 默认的作用域为 singleton — 单例作用域(全局共享), 因此修改 u.name 时 user.name 也被一并修改

singleton — 单例作用域


描述🍭

该作用域下的 Bean 在 IOC 容器中只存在一个实例

即获取 Bean(ApplicationContext.getBean())与装配 Bean(@Autowired)都是针对同一个对象

(Bean 的默认作用域为 singleton — 单例作用域)

适用场景🍭

通常无状态的 Bean 使用该作用域

即不会对 Bean 进行修改(只读)

为什么 Spring 选择 singleton 作为 Bean 的默认作用域🍭

单例模式只在第一次加载时速度较慢

在后续使用时可直接使用, 无需等待

因此其性能最优

prototype — 原型作用域


prototype 也可以称为多例作用域(对比单例作用域)

描述🍭

每次对该作用域下的 Bean 的请求都会创建一个新的实例(深拷贝)

即获取 Bean(ApplicationContext.getBean())与装配 Bean(@Autowired)都是针对新的对象实例

适用场景🍭

通常有状态的 Bean 使用该作用域

即会对 Bean 进行修改

相关文章
|
消息中间件 存储 监控
vep视频翻录为mp4(支持大黄蜂云课堂6.05)
今天教大家怎么翻录大黄蜂vep视频,支持大黄蜂云课堂6.05的最新版。 教程很简单,大家跟着自己尝试下即可。
4807 0
vep视频翻录为mp4(支持大黄蜂云课堂6.05)
|
DataWorks 数据库 流计算
实时数仓 Hologres产品使用合集之如何对视图进行授权
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
10月前
|
关系型数据库 MySQL 数据库连接
Pgloader极简教程
pgloader 是一款强大的数据同步与迁移工具,专为将数据从多种来源迁移到 PostgreSQL 设计。它支持从文件(如 CSV)和多种数据库系统(如 SQLite、MySQL)迁移数据。pgloader 提供了丰富的安装选项,包括手动编译安装,适用于不同操作系统。使用上,既可以通过命令行直接操作,也可以通过配置文件进行复杂的数据迁移任务,如表结构和数据的同步。其高效性和灵活性使得数据库迁移变得更加简便和可靠。
1232 4
|
10月前
|
存储 编译器 CDN
Zig 变量和常量
Zig 变量和常量
112 3
|
缓存 JSON JavaScript
Webpack 传递给 Loader 的原始内容是一个 UTF-8 格式编码的字符串
本文详细介绍了Webpack中Loader的概念及其重要性。Webpack仅支持处理JS和JSON文件,而对于CSS、图片等其他类型文件,则需要Loader来转换。文章列举了多种常见Loader,如css-loader、style-loader、babel-loader等,并提供了具体配置示例。此外,还介绍了如何自定义Loader,包括初始化项目、实现基本功能及处理异步操作等内容。通过本文,读者可以全面了解Loader的作用及其实现方法。
92 3
|
设计模式 JavaScript 前端开发
现代JavaScript框架比较:React、Vue和Angular
在现代Web开发中,JavaScript框架已成为开发高效、动态用户界面的关键工具。本文将深入比较三大主流框架:React、Vue和Angular。通过探讨它们的核心特性、优缺点和适用场景,帮助开发者根据项目需求选择最合适的框架。重点分析包括性能、学习曲线、社区支持和生态系统等方面,以便开发者能够做出明智的决策,优化开发流程并提升应用性能。
成员内部类、静态内部类、局部内部类、匿名内部类的精髓与应用
成员内部类、静态内部类、局部内部类、匿名内部类的精髓与应用
222 0
|
监控 NoSQL 关系型数据库
Redis变慢了?
简要简述如何评测redis变慢了以及针对变慢问题的优化
Redis变慢了?
|
小程序 C++
【C/C++教学】劫持?劫持?劫持?!!!(二)
【C/C++教学】劫持?劫持?劫持?!!!
293 0
【C/C++教学】劫持?劫持?劫持?!!!(二)