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
相关产品推荐
相关产品推荐

