эквивалент @Bean (initMethod = start, destroyMethod = stop) на quarkus

Я хотел бы знать, есть ли на Quarkus аналогичная аннотация для

@Bean (initMethod = start, destroyMethod = stop)

Я работаю со сторонней библиотекой, у которой есть класс final, поэтому я не могу расширить ее для реализации @PostConstruct и @PreDestroy. Решение в Spring было бы очень простым, мне просто нужно было бы инициализировать его bean-компонент с этими двумя аргументами в аннотации; Однако мне не удалось найти что-то похожее на Quarkus.


person Filipe Tabosa    schedule 23.03.2021    source источник


Ответы (1)


Решение от CDI, которое, очевидно, работает в Quarkus (см. Справочник по Quarkus CDI / Поддерживаемые функции ), заключается в использовании производителей и утилизаторов. Итак, в классе:

@ApplicationScoped // might not be needed - TBD
public class ThirdPartyBeanManager {
    @Produces @ApplicationScoped // use the appropriate scope
    public ThirdPartyBean getThirdPartyBean() {
        ThirdPartyBean thirdPartyBean = new ThirdPartyBean();
        // ***HERE IS THE MANUAL @PostConstruct/initMethod CALL***
        thirdPartyBean.start();
        return thirdPartyBean;
    }

    // ***THIS IS THE EQUIVALENT OF @PreDestroy/destroyMethod***
    public void dispose(@Disposes ThirdPartyBean thirdPartyBean) {
        thirdPartyBean.stop();
    }
}

Могут быть некоторые детали, которые нужно уточнить (например, менеджер не обязательно должен быть полным компонентом CDI, и, я думаю, ему не нужно хранить ссылку на созданный компонент), но это общая концепция.

Другая идея, основанная на этой концепции, - заключить стороннюю зависимость в собственный API. Ваш API / bean-компонент будет использовать стороннюю организацию внутри и перенаправлять свои собственные _2 _ / _ 3_ вызовы третьей стороне. Недостаток - больше кода; Преимущество состоит в том, что теперь ваше приложение отделено от сторонних разработчиков, и самым непосредственным следствием этого является то, что теперь вы можете имитировать эту зависимость в тестах.

person Nikos Paraskevopoulos    schedule 23.03.2021
comment
Отлично, похоже, это работает =). Большое спасибо - person Filipe Tabosa; 25.03.2021