相当于 quarkus 上的 @Bean(initMethod = "start", destroyMethod = "stop")

equivalent to @Bean(initMethod = "start", destroyMethod = "stop") on quarkus

我想知道 Quarkus 上是否有一些等效的注释

@Bean(initMethod = "start", destroyMethod = "stop")

我正在使用第三方库,它有一个最终的 class,因此我无法扩展它来实现 @PostConstruct 和 @PreDestroy。 Spring 的解决方案非常简单,我只需要用注释上的这两个参数初始化它的 bean;但是,我在 Quarkus 上找不到类似的东西。

CDI 的一个解决方案显然适用于 Quarkus(参见 Quarkus CDI Reference/Supported features),它是使用生产者和处理器。所以,在 class:

@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 bean,我认为它也不需要保留对生成的 bean 的引用),但这是一般概念。

另一个基于此概念的想法是将第三方依赖项包装在您自己的 API 中。您的 API/bean 将在内部使用第三方并将其自己的 @PostConstruct/@PreDestroy 调用转发给第三方。缺点是代码较多;优点是现在您的应用程序与第 3 方分离,最直接的结果是您现在可以在测试中模拟该依赖关系。