按照指南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>
被记录了两次。
这是预期的行为吗?如果可以的话,这将实现什么?
答案 0 :(得分:4)
您使用什么版本的quarkus?除非将bean注入某个地方,否则不应在quarkus 1.4.0 + 中记录两次。
两次调用no-args构造函数的原因是,对于普通作用域的bean,总是使用nor-ags构造函数创建客户端代理。而且此客户端代理是AppInstance
的子类。
实际上,您不应像这样初始化普通的作用域bean,而应使用@PostConstruct
回调。
在不使用客户端代理的情况下,您也可以将bean的范围更改为javax.inject.Singleton
。
无论如何,这是the spec和相关资源中描述的CDI普通作用域的众所周知的限制/功能。