You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quarkus中@Singleton、@Producer及二者组合的区别解析(附Spring类比)

Quarkus三种注解组合的区别(附Spring类比)

以下针对你给出的三种代码场景,逐一拆解Quarkus中的行为,并对应到Spring框架的同类用法:


1. 仅@Produces注解

public class Configuration {
    @Produces
    public MyBean abc() {
        return new MyBean();
    }
}
  • Quarkus行为:
    这个方法是CDI规范中的生产者方法,专门用来向容器提供MyBean实例。由于未指定作用域,默认使用@Dependent作用域——每次有地方通过@Inject注入MyBean时,都会调用abc()生成一个全新的实例。另外,Configuration类本身不会被CDI容器管理,仅该方法会被容器识别为Bean的来源。
  • Spring类比:
    等同于在Spring配置类中给方法标注@Bean + @Scope("prototype"),每次依赖注入都会创建新的Bean实例。

2. 仅@Singleton注解

public class Configuration {
    @Singleton
    public MyBean abc() {
        return new MyBean();
    }
}
  • Quarkus行为:
    这种写法无效。@Singleton是CDI的作用域注解,单独标注在普通方法上不会被容器识别——该方法不会成为Bean生产者,MyBean也不会被纳入依赖注入体系,无法通过@Inject获取它的实例。@Singleton要么标注在类上(将整个类变为单例Bean),要么配合@Produces指定生产者方法生成Bean的作用域。
  • Spring类比:
    等同于在Spring配置类中写了一个普通方法(未加@Bean),Spring不会把这个方法的返回值注册为容器中的Bean,无法通过@Autowired获取实例。

3. @Singleton + @Produces组合

public class Configuration {
    @Singleton
    @Produces
    public MyBean abc() {
        return new MyBean();
    }
}
  • Quarkus行为:
    这是标准的单例Bean生产者写法。@Produces告诉容器该方法负责生成MyBean实例,@Singleton指定生成的Bean为单例作用域——容器只会调用abc()一次,创建唯一的MyBean实例,之后所有注入MyBean的地方都会拿到同一个实例。同样,Configuration类本身不需要是CDI Bean。
  • Spring类比:
    等同于在Spring配置类中给方法标注@Bean(Spring默认即为单例作用域),容器只会创建一次实例,所有注入点共享同一个对象。

内容的提问来源于stack exchange,提问作者Evgeny Mordyasov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:46:20