Quarkus 应用程序启动 bean 初始化两次

Quarkus application startup bean initalized twice

按照指南 https://quarkus.io/guides/lifecycle#startup_annotation,我创建了一个 class 来在启动时初始化一些元数据 class:

@Startup
@ApplicationScoped
public class AppInstance {

    private final UUID id;
    private static final Logger logger = LoggerFactory.getLogger(AppInstance.class);

    AppInstance() {
        this.id = UUID.randomUUID();
        logger.info("App id: {}", this.id.toString());
    }

    public UUID getId() {
        return id;
    }
}

当我 运行 mvn quarkus:dev 我看到消息 App id: <some uuid> 被记录了两次。

这是预期的行为吗?如果是这样,这实现了什么?

您使用什么版本的 quarkus?它不应该在 quarkus 1.4.0+ 中记录两次,除非 bean 被注入某处。

无参数构造函数被调用两次的原因是对于普通范围的 bean,客户端代理总是使用 nor-ags 构造函数创建的。而这个客户端代理是 AppInstance.

的子类

事实上,您不应该像这样初始化普通作用域 bean,而是使用 @PostConstruct 回调。

您还可以将 bean 的范围更改为 javax.inject.Singleton,在这种情况下不使用客户端代理。

无论如何,这是 the spec 和相关资源中描述的众所周知的 limitation/feature CDI 正常范围。