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

Bean 作用域和生命周期

一、Bean 的六种作用域

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

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

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

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

  1. Singleton(单例):

    • 单例是一种设计模式,指的是在整个应用程序生命周期内只存在一个实例。在Spring框架中,默认情况下,Bean的作用域是Singleton,这意味着每次从Spring容器中获取该Bean时,都会返回相同的实例。
  2. Prototype(原型):

    • 原型是指每次从容器中获取Bean时都会创建一个新的实例。与Singleton不同,原型作用域的Bean在每次请求时都会生成一个新的实例。这对于某些需要隔离状态的Bean非常有用。
  3. Request(请求):

    • 请求作用域是Web应用程序中的一种作用域,它表示每个HTTP请求都会创建一个新的Bean实例。这样的Bean只在处理单个HTTP请求期间存在,适用于Web应用程序中的请求级别依赖。
  4. Session(会话):

    • 会话作用域表示每个用户会话(通常是浏览器会话)都会创建一个新的Bean实例。这意味着用户在应用程序中的不同HTTP请求之间可以共享相同的Bean状态。通常用于保存用户特定的状态信息。
  5. Application(应用程序):

    • 应用程序作用域表示整个Web应用程序生命周期内只创建一个Bean实例。这意味着无论有多少个用户会话,它们都共享相同的Bean实例。通常用于在整个应用程序中共享全局状态。
  6. WebSocket(Web套接字):

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

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

二、设置 Bean 的作用域

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

  1. 直接设置值:@Scope(“prototype”)
  2. 使用枚举设置:@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)执行初始化的后置方法
  4. 使用 Bean。
  5. 销毁 Bean。

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

相关文章:

  • 「图像 merge」无中生有制造数据
  • pytorch复现_NMS
  • 11.1 知识总结(JavaScript)
  • 大数据之LibrA数据库系统告警处理(ALM-12007 进程故障)
  • web3:智能合约浏览器版本的 IDE - remix 使用教程
  • R语言在生态环境领域中的实践技术应用
  • 牛客网刷题-(9)
  • android下的app性能测试应主要针对那些方面,如何开展?
  • [.NET]桃源网络硬盘 v7.4
  • MySQL - 系统库之 sys
  • 【Python 千题 —— 基础篇】乘法计算
  • [SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务
  • 四级核心词汇
  • 【C/C++】空指针访问成员函数
  • 如何卸载干净 IDEA(图文讲解)windows和Mac教程
  • 分享的文章《人生如棋》
  • [deviceone开发]-do_Webview的基本示例
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【面试系列】之二:关于js原型
  • 03Go 类型总结
  • Angular6错误 Service: No provider for Renderer2
  • eclipse(luna)创建web工程
  • JS字符串转数字方法总结
  • linux安装openssl、swoole等扩展的具体步骤
  • mongo索引构建
  • Shadow DOM 内部构造及如何构建独立组件
  • springMvc学习笔记(2)
  • SQLServer之创建显式事务
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 解决iview多表头动态更改列元素发生的错误
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 聊聊flink的BlobWriter
  • 前端攻城师
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 时间复杂度与空间复杂度分析
  • 使用Gradle第一次构建Java程序
  • 由插件封装引出的一丢丢思考
  • 源码安装memcached和php memcache扩展
  • 【干货分享】dos命令大全
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ###STL(标准模板库)
  • #define用法
  • #Linux(权限管理)
  • #QT(TCP网络编程-服务端)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)常见O(n^2)排序算法解析
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (python)数据结构---字典
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (六)vue-router+UI组件库
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (算法)Travel Information Center
  • (转)Mysql的优化设置