spring创建的独享默认是单例的还是非单例的

9次阅读
没有评论

 

在 Spring 框架中,Bean 的默认作用域(Scope)是 单例的(Singleton)

这意味着,在同一个 Spring IoC 容器中,针对一个特定的 Bean 定义,Spring 只会创建一个共享的实例。无论你通过 @Autowired 注入多少次,或者调用多少次 getBean(),获取到的都是同一个对象


1. Spring Bean 的常见作用域对比

为了让你更清楚“单例”所处的位置,我们可以看这个对比表:

作用域 (Scope) 是否默认 行为描述
singleton 单例:整个容器中只有一个实例。
prototype 原型:每次获取(注入或 getBean)都会创建一个新实例。
request 请求(Web环境):每个 HTTP 请求创建一个实例。
session 会话(Web环境):每个 HTTP 会话创建一个实例。

2. 为什么 Spring 默认选“单例”?

  1. 性能极高:不需要频繁地进行对象的创建和销毁(GC 压力小)。

  2. 减少内存消耗:对于 Controller、Service、DAO 这种逻辑组件,它们本身不保存客户状态,没必要创建多个。

  3. 方便管理:Spring 可以在启动时就预加载好这些单例,提高响应速度。


3. 单例模式的“坑”:线程安全问题

这是面试和实际开发中最需要注意的地方:Spring 的单例 Bean 并不是线程安全的。

  • 有状态的 Bean(Stateful):如果你的 Service 类里定义了一个成员变量 private int count = 0;,当多个用户同时访问时,这个 count 会被互相覆盖,导致数据混乱。

  • 无状态的 Bean(Stateless):如果你的类里只有方法逻辑(绝大多数 Controller 和 Service 都是这样),那么单例是绝对安全的。

💡 避坑建议: 在 Spring 的单例 Bean 中,尽量不要定义成员变量。如果一定要定义,请确保它是只读的,或者使用 ThreadLocal 来保证线程隔离。


4. 如何修改为非单例?

如果你确实需要每次都拿新对象,可以使用 @Scope 注解:

Java

@Component
@Scope("prototype") // 修改为原型模式,每次注入都是新对象
public class MyService {
    // ...
}

总结

Spring 创建的 Bean 默认是单例的。这符合“无状态服务”的设计理念,既省内存又跑得快。

既然聊到了单例和线程安全,你想看看在你的 BtcPrivateKeyServiceImpl 中,如果有成员变量,在高并发下会发生什么诡异的 Bug 吗?我可以为你演示一下如何用 ThreadLocal 来修复它。

正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-03-21发表,共计1045字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)

摆渡资源站

文章搜索
一言一句话
-「
热门文章
2026比特币稳赚指南:顶级加密交易策略全揭秘!

2026比特币稳赚指南:顶级加密交易策略全揭秘!

    关键要点 定投(DCA):仍是比特币长期积累的低风险和纪律性策略。 趋势交易和波段...
使用Java类库ta4j计算基金的布林轨

使用Java类库ta4j计算基金的布林轨

ta4j简介 对于做金融分析的从业者而言,python的ta-lib是不可或缺的技术分析库,具有简单易用、功能...
全真早晚功课简介

全真早晚功课简介

         道教的斋醮仪式很多,主要的日常宗教活动是早晚功课经。凡是道教徒每天都要上殿唪诵,所...
吕祖朝科

吕祖朝科

  举步朝金阙    飞身谒玉京  天外琳琅响    齐举步虚声   步虚  宝座临金殿    霞光...
视频防止下载-java

视频防止下载-java

  cv教程 使用Java CV 实现Http-flv、Hls流媒体服务器从摄像头获取的一般是RTS...
最新评论
333985 333985 每天都在战争,希望2026和平.
最新文章
java 中int[] 和arraylist区别

java 中int[] 和arraylist区别

  在 Java 中,int[](基本类型数组)和 ArrayList<Integer>...
spring创建的独享默认是单例的还是非单例的

spring创建的独享默认是单例的还是非单例的

  在 Spring 框架中,Bean 的默认作用域(Scope)是 单例的(Singleton)。...
这四种策略正好覆盖了金融交易中最经典的四种“赚钱逻辑”

这四种策略正好覆盖了金融交易中最经典的四种“赚钱逻辑”

  太棒了,你列出的这四种策略正好覆盖了金融交易中最经典的四种“赚钱逻辑”。 为了让你有直观的感受,...
Freqtrade OctoBot 都支持什么模式获利

Freqtrade OctoBot 都支持什么模式获利

  这两个开源项目在获利逻辑(策略)上有明显的风格差异:Freqtrade 像是一个给赛车手提供的“...
开源的okx三方对接交易机器人,不限制语言有吗?

开源的okx三方对接交易机器人,不限制语言有吗?

  关于开源的 OKX 第三方交易机器人,目前市面上有很多成熟的框架。它们通常不限制于单一语言,因为...