@Singleton和@ApplicationScoped的区别

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
可观测监控 Prometheus 版,每月50GB免费额度
简介: 在JakartaEE的CDI标准中@Singleton和@ApplicationScoped的区别

@Singleton和@ApplicationScoped都是应用范围的bean,主要区别在于:

@Singleton:

  1. bean的实例在第一次注入时创建,之后始终使用同一个实例。
  2. 可以直接访问bean的字段,因为始终是同一个实例。
  3. 不支持mock,因为没有代理可以拦截方法调用。
  4. 略微更高的性能,因为没有代理的开销。

@ApplicationScoped:

  1. bean的实例在第一次方法调用时创建,注入点注入的是一个代理。
  2. 不能直接访问bean的字段,需要通过方法调用,因为注入的是一个代理。
  3. 支持mock,可以使用Mockito或Quarkus Mock来mock @ApplicationScoped bean。
  4. 可以在运行时重新创建实例,注入点无需变化,因为注入的一直是代理。
    所以,总体来说:

如果需要直接访问bean的状态,选择@Singleton。

如果需要mock或在运行时重新创建实例,选择@ApplicationScoped。

除非有明显的性能要求,否则推荐默认使用@ApplicationScoped,因为它更灵活和易测试。只有当直接访问bean状态或有较高的性能要求时,才使用@Singleton。

两者的其他方面,如作用域、代理、延迟初始化等行为都是相同的。所以除上述区别外,在大多数情况下可以互换使用。

目录
相关文章
|
3月前
|
设计模式 安全 Java
Singleton 的双重检查锁定
【8月更文挑战第23天】
42 2
|
安全 C#
单例模式(Singleton)
单例模式(Singleton)
68 0
|
设计模式 存储 安全
|
设计模式 Java
浅谈单例模式(Singleton)
单例模式的介绍 优点 缺点 Synchronized Synchronized示例 Synchronized与非Synchronized Singleton 第一个示例 第二个示例 第三个示例 第四个示例 第五个示例
137 0
单例模式(singleton)
转载 确保对象的唯一性——单例模式 (一)确保对象的唯一性——单例模式 (二)确保对象的唯一性——单例模式 (三)确保对象的唯一性——单例模式 (四)确保对象的唯一性——单例模式 (五)
924 0