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

SpringBoot当中的Singleton和Prototype详解

在Spring Boot中,Singleton和Prototype是两种Bean的作用域。这两种作用域决定了Spring容器如何创建和管理Bean的实例。

  1. Singleton(单例):

    • 当一个Bean被配置为Singleton作用域时,Spring容器在启动时只会创建该Bean的一个实例,并在后续的所有请求中共享这个单例实例。
    • 这是默认的作用域,如果你没有明确指定Bean的作用域,那么Spring会默认将其作为Singleton处理。
    • 对于无状态或者线程安全的Bean,通常选择Singleton作用域,因为这样可以提高性能并减少内存消耗。
  2. Prototype(原型):

    • 当一个Bean被配置为Prototype作用域时,每次通过Spring容器请求该Bean时,都会创建一个新的实例。
    • 这意味着对于每个请求或依赖注入,都会生成一个新的对象,每个对象之间是独立的,修改一个实例的状态不会影响到其他实例。
    • 对于有状态或者非线程安全的Bean,通常选择Prototype作用域,以确保每个请求都有自己的独立对象。

在Spring Boot中,你可以通过以下方式在Java配置或XML配置中指定Bean的作用域:

Java配置示例:

@Bean
@Scope("singleton") // 默认值,可以省略
public MySingletonBean mySingletonBean() {return new MySingletonBean();
}@Bean
@Scope("prototype")
public MyPrototypeBean myPrototypeBean() {return new MyPrototypeBean();
}

XML配置示例:

<bean id="mySingletonBean" class="com.example.MySingletonBean" scope="singleton" /><bean id="myPrototypeBean" class="com.example.MyPrototypeBean" scope="prototype" />

总的来说,Spring Boot中的Singleton和Prototype作用域与Spring框架中的行为是一致的,它们主要影响了Bean的实例化策略和生命周期管理。

  1. 类上修饰@Scope和方法上修饰@Scope的区别

在Spring中,@Scope注解用于定义Bean的作用域。当这个注解应用在类或方法上时,它们的主要区别在于作用的范围和影响的对象创建方式:

类上修饰@Scope:
当@Scope注解应用于类级别时,它会影响该类的所有实例。
例如,如果你将一个类标记为@Scope(“prototype”),那么每次请求或依赖注入该类的实例时,Spring容器都会创建一个新的对象。

方法上修饰@Scope(这种方法级别的作用域通常被称为“方法作用域”或“Scoped Proxy”):

当@Scope注解应用于方法级别时,它的效果通常与AOP(面向切面编程)代理一起使用。

在这种情况下,Spring会为这个方法创建一个代理对象,然后根据指定的作用域策略来管理这个代理对象的生命周期。

例如,如果你在一个配置类的方法上使用@Scope(“request”),那么每当一个新的HTTP请求到达时,Spring会为这个方法创建一个新的代理对象,并在这个请求的范围内共享这个对象。

需要注意的是,方法级别的@Scope通常不直接应用于业务类,而是应用于配置类中的@Bean方法。这是因为业务类通常不直接由Spring容器管理,而是通过配置类中的@Bean方法来定义和初始化。

总结起来,类上的@Scope影响整个类的所有实例,而方法上的@Scope主要用于定义特定方法的行为,并且通常与AOP代理一起工作,以实现更细粒度的作用域控制。在实际使用中,方法级别的作用域相对较少见,大多数情况下,我们会在类级别或者@Bean方法级别上使用@Scope注解。

  1. Spring注入的类重复调用对应的方法是活创建多个实例还是永远是一个实例?

在Spring中,对象的创建和管理是由Spring容器负责的。对于注入的类,如果它们被配置为Singleton作用域(这是默认的作用域),那么无论你如何多次调用该类的方法,Spring容器只会创建一个实例,并在所有需要的地方共享这个单例实例。

如果你将类配置为Prototype作用域,那么每次请求都会创建一个新的实例。在这种情况下,即使你调用的是同一个方法,但如果是在不同的实例上进行的,那么该方法就会被多个类实例分别调用。

所以,是否创建多个类实例取决于你在Spring配置中设置的作用域。对于Singleton作用域,永远都是同一个类实例;而对于Prototype作用域,每次请求都会创建一个新的类实例。

  1. 如果修改类当中的变量的值。其他地方调用这个值会变吗

这取决于类的作用域和变量的访问修饰符。

如果类被配置为Singleton作用域,并且变量是实例变量(非static),那么当在一个地方修改该变量的值时,其他地方调用这个变量时会看到更改后的值,因为整个应用中只有一个共享的实例。

如果类被配置为Prototype作用域,每次请求都会创建一个新的实例。因此,如果在一个实例中修改变量的值,其他实例中的相同变量不会受到影响,因为它们是独立的对象。

对于静态变量(static),无论类的作用域如何,所有实例共享同一个静态变量。所以,如果在一个地方修改静态变量的值,所有地方调用这个静态变量时都会看到更改后的值。

对于局部变量(在方法内部定义的变量),它们只在该方法的上下文中存在,修改局部变量的值不会影响到其他方法或实例中的变量。

总的来说,变量的可见性和变化范围取决于它的作用域(静态或实例)、类的作用域(Singleton或Prototype)以及访问修饰符(public、private、protected等)。

相关文章:

  • linux x86 setup_arch代码注释
  • 2023-12-17 LeetCode每日一题(使用最小花费爬楼梯)
  • Linux操作系统( YUM软件仓库技术 )
  • 【数值分析】choleskey分解,matlab实现
  • OpenEular23.09(欧拉)操作系统为企业搭建独立的K8S集群环境,详细流程+截图
  • DS|队列
  • Docker 容器命令总汇
  • 【温故而知新】探讨下对vue的mixin的理解
  • springcloud微服务篇--6.网关Gateway
  • Mybatis 传参的方式
  • 计算机组成原理-总线概述
  • 【数据结构——二叉树】二叉树及其应用2023(头歌习题)【合集】
  • 解决基于VectorGrid的矢量瓦片Y轴偏移的问题
  • 软件有效找不到dll文件,五种可靠的解决dll方法分享
  • Zookeeprt实战(待完善)
  • $translatePartialLoader加载失败及解决方式
  • 10个最佳ES6特性 ES7与ES8的特性
  • CODING 缺陷管理功能正式开始公测
  • ES6 ...操作符
  • ES6简单总结(搭配简单的讲解和小案例)
  • iOS 颜色设置看我就够了
  • Java 网络编程(2):UDP 的使用
  • JS数组方法汇总
  • Node 版本管理
  • react-native 安卓真机环境搭建
  • ucore操作系统实验笔记 - 重新理解中断
  • windows下使用nginx调试简介
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 浮动相关
  • 复杂数据处理
  • 构造函数(constructor)与原型链(prototype)关系
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端技术周刊 2019-02-11 Serverless
  • 前端知识点整理(待续)
  • 数组大概知多少
  • 微信公众号开发小记——5.python微信红包
  • 写代码的正确姿势
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • zabbix3.2监控linux磁盘IO
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​如何防止网络攻击?
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # Apache SeaTunnel 究竟是什么?
  • (0)Nginx 功能特性
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)WCF的Binding模型
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (转)创业家杂志:UCWEB天使第一步
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?