Компонент запуска приложения Quarkus инициализирован дважды - PullRequest
1 голос
/ 18 июня 2020

Следуя руководству 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 Ответ

2 голосов
/ 18 июня 2020

Какую версию кваркуса вы используете? Он не должен регистрироваться дважды в quarkus 1.4.0 + , если только bean-компонент не внедрен где-то.

Конструктор no-args вызывается дважды, потому что для обычных bean-компонентов с ограниченной областью видимости клиентский прокси всегда создается с помощью конструктора nor-ags. И этот клиентский прокси является подклассом AppInstance.

Фактически, вам не следует инициализировать обычный bean-компонент с ограниченной областью видимости, как этот, а вместо этого использовать обратный вызов @PostConstruct.

Вы также можете измените область действия вашего bean-компонента на javax.inject.Singleton, и в этом случае клиентский прокси не используется.

В любом случае, это хорошо известное ограничение / функция обычных областей действия CDI, описанных в spe c и соответствующие ресурсы.

...