🔎前置
引入 Lombok
- 引入 Lombok 相关依赖
- 下载 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 进行修改