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 正常范围。
按照指南 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 正常范围。