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

时间:2020-06-18 13:18:58

标签: quarkus

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

@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>被记录了两次。

这是预期的行为吗?如果可以的话,这将实现什么?

1 个答案:

答案 0 :(得分:4)

您使用什么版本的quarkus?除非将bean注入某个地方,否则不应在quarkus 1.4.0 + 中记录两次。

两次调用no-args构造函数的原因是,对于普通作用域的bean,总是使用nor-ags构造函数创建客户端代理。而且此客户端代理是AppInstance的子类。

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

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

无论如何,这是the spec和相关资源中描述的CDI普通作用域的众所周知的限制/功能。