Bean 作用域和生命周期

简介: Bean 作用域和生命周期

一、Bean 的六种作用域

在介绍 Bean 的作用域之前,我们先看一下作用域的概念:

定义: 限定程序中变量的可用范围叫做作用域。

结合以上定义,具体到 Bean 对象来说,Bean 的作用域就是指 Bean 在 Spring 整个框架中的作用范围

Spring 中有六种作用域,下面是关于每个作用域的详细介绍:

  1. Singleton(单例):
  • 单例是一种设计模式,指的是在整个应用程序生命周期内只存在一个实例。在Spring框架中,默认情况下,Bean的作用域是Singleton,这意味着每次从Spring容器中获取该Bean时,都会返回相同的实例。
  1. Prototype(原型):
  • 原型是指每次从容器中获取Bean时都会创建一个新的实例。与Singleton不同,原型作用域的Bean在每次请求时都会生成一个新的实例。这对于某些需要隔离状态的Bean非常有用。
  1. Request(请求):
  • 请求作用域是Web应用程序中的一种作用域,它表示每个HTTP请求都会创建一个新的Bean实例。这样的Bean只在处理单个HTTP请求期间存在,适用于Web应用程序中的请求级别依赖。
  1. Session(会话):
  • 会话作用域表示每个用户会话(通常是浏览器会话)都会创建一个新的Bean实例。这意味着用户在应用程序中的不同HTTP请求之间可以共享相同的Bean状态。通常用于保存用户特定的状态信息。
  1. Application(应用程序):
  • 应用程序作用域表示整个Web应用程序生命周期内只创建一个Bean实例。这意味着无论有多少个用户会话,它们都共享相同的Bean实例。通常用于在整个应用程序中共享全局状态。

WebSocket(Web套接字):

  • WebSocket是一种用于实现双向通信的协议,允许Web应用程序中的客户端和服务器之间进行实时的、双向的数据传输。WebSocket作用域是一种特殊的作用域,通常用于在WebSocket连接期间存储和管理相关数据。这种作用域通常是与特定WebSocket连接关联的,每个WebSocket连接可以具有自己的作用域。

这里需要注意的是: 其中上述 3、4、5、6是 Spring MVC 中的值,在普通的 Spring 项目中只有1、2两种。

二、设置 Bean 的作用域

在 Spring 中使用 @Scope 可以声明 Bean 的作用域,@Scope 既可以修饰方法也可以修饰类,使用@Scope 设置作用域,有两种设置方式:


直接设置值:@Scope(“prototype”)

使用枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

使用示例:

我们知道,在Spring框架中,默认情况下,Bean的作用域是Singleton,所以默认情况下,如下的 Projecter1 和 Projecter2 获取到的是同一个 Bean 对象,因此 Projecter1 对 Bean 进行的修改,会影响到 Projecter2 获取到的同一个 Bean 对象:

下面我们使用 @Scope(“pototype”) 对 User 进行作用域声明,在进行测试:

@Component
public class Users {
    @Bean("user")
    @Scope("prototype") // 设置原型作用域
    public User user(){
        User user = new User();
        user.setName("这是初始数据");
        return user;
    }
}

三、Bean 的生命周期

所谓的生命周期指的是⼀个对象从诞生到销毁的整个生命过程,Bean 的生命周期分为以下 5 大部分:

  1. 实例化 Bean。在这个阶段,Bean实例被创建,主要进行内存分配,但还没有被初始化。
  2. 设置 Bean 属性。在Bean被实例化后,Spring容器会将依赖的其他Bean引用注入到当前Bean中。
  3. 初始化 Bean。

(1)执行各种通知
(2)执行初始化的前置方法
(3)执行初始化方法
(4)执行初始化的后置方法

  1. 使用 Bean。
  2. 销毁 Bean。

注: 先进行依赖注入再进行初始化的设计是为了确保 Bean 的依赖项在初始化之前已经被满足,从而保证Bean在初始化过程中可以访问到它所依赖的其他组件。

相关文章
|
编解码 人工智能 数据格式
中国GDP空间分布公里网格数据集
中国GDP空间分布公里网格数据集
319 0
|
编译器 C语言 C++
【C语言】realloc()函数详解(动态内存开辟函数)
【C语言】realloc()函数详解(动态内存开辟函数)
217 0
|
JavaScript
JS设置日期为0时0分0秒
项目中经常要给设置默认值,搜索从哪天开始,这时候,如果直接通过new Date()来获取时间,会有时分秒,如果快速设置为0时0分0秒?
514 0
|
2月前
|
网络协议 安全 API
WebSocket、Socket、TCP 和 HTTP 的差别与应用场景
WebSocket、Socket、TCP 和 HTTP 是网络通信中的四大“使者”,各具特色:HTTP 适合短时请求,TCP 稳定可靠,Socket 灵活定制,WebSocket 实现实时双向通信。本文用通俗语言解析它们的区别与应用场景,助你为项目选择最合适的通信方式。
892 3
|
7月前
|
人工智能 Java 程序员
一文彻底搞定C语言的表达式和语句
本文介绍了C语言中的表达式和语句,涵盖算术、关系等表达式及各类语句的用法,帮助初学者理解核心概念。本文介绍C语言表达式(算术、关系等)和语句(表达式、复合、控制、函数、空语句),助你掌握核心概念。
336 0
一文彻底搞定C语言的表达式和语句
|
11月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
163 3
|
11月前
|
JavaScript 前端开发 算法
对比一下Vue2 和 Vue3?—— 8个方面给你答案
本文介绍了 Vue 和 React 的起源、核心思想、表现形式、API 差异、社区差异、升级方向、响应式原理、Diff 算法、事件机制,并进行了总结。Vue 以其渐进式框架设计和简洁性著称,而 React 则强调单向数据流和灵活性。两者均支持组件化开发和虚拟 DOM,适用于不同的开发场景。
181 0
对比一下Vue2 和 Vue3?—— 8个方面给你答案
|
前端开发 架构师 算法
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
不论你是职场新人还是35岁的职场“老人”,成长是每个职场人都绕不开的话题,同时也是贯穿每个人职业生涯的痛点。本文主要帮助读者建立起对个人成长的认知,然后在此认知的基础上让大家理解成长的本质,最终通过文章的引导,来帮助读者完成个人成长路线图的确定以及落地实践。
13763 3
技术一号位的方法论《个人篇》——人成长的本质以及如何构建个人成长路线图
|
存储 关系型数据库 MySQL
用户案例合集 | 物联网平台的时序数据处理难点与优化实践
本文汇总了四个典型的物联网平台的实践经验,把它们曾面临的数据难题以及解决思路分享给大家。
461 0
|
存储 分布式计算 Hadoop
hadoop节点HDFS数据分片过程
【5月更文挑战第18天】
246 1