Как зарегистрировать боб программно в Quarkus? - PullRequest
1 голос
/ 29 апреля 2020

Я пытаюсь найти способ, как программно создать бин в quarkus DI, но безуспешно. Возможно ли в этих рамках? Похоже, что BeanManager пока не реализует необходимый метод.

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Вы можете внедрить ваши bean-компоненты, используя Instance:

    @Inject
    public TestExecutorService(final ManagedExecutor managedExecutor,
                               final Instance<YourTask> YourTask) {
        this.managedExecutor = managedExecutor;
        this.YourTask= YourTask;
    }

И если вам нужно создать более одного экземпляра, вы можете использовать управляемого исполнителя:

tasks.forEach(task -> managedExecutor.submit(task::execute));

Имейте в виду, что в зависимости от того, как вы запускаете бин, вам может потребоваться уничтожить его, и только «класс создателя» имеет ссылку, то есть вы должны создавать и уничтожать бин в одном и том же классе (вы можете использовать что-то вроде событий, чтобы справиться с этим).

Для получения дополнительной информации, пожалуйста, проверьте: Документация CDI

0 голосов
/ 30 апреля 2020

Во-первых, мы должны уточнить, что именно означает "программно создать бин" .

Но прежде всего мы должны определить, что означает "боб" . В CDI мы говорим о bean-компонентах в двух значениях:

  1. Метаданные компонента - этот описывает атрибуты компонента и способ создания экземпляра компонента; SPI javax.enterprise.inject.spi.Bean
  2. Экземпляр компонента - реальный экземпляр, используемый в приложении; в спецификации c мы называем это «контекстной ссылкой».

Метаданные обычно получают из классов приложения. Такие метаданные «поддерживаются классом». Под «поддержкой класса» я подразумеваю все виды , описанные в статье c. То есть компоненты класса, методы производителя и поля производителя.

Теперь, если вы хотите программно получить экземпляр компонента (вариант 2), вы можете:

  1. Ввести javax.enterprise.inject.Instance; см., например, документы по сварке
  2. Используйте CDI.current().select(Foo.class).get()
  3. Используйте спецификацию quarkus c Arc.container().instance(Foo.class).get()

Однако, если вы хотите добавить / зарегистрировать метаданные компонента , которые не поддерживаются классом (вариант 2), вам необходимо добавить расширение, использующее специфицированные quarkus c SPI, например как BeanRegistrar .

...