在Quarkus中调用bean的postConstruct和preDestroy方法

时间:2020-02-12 10:39:07

标签: cdi quarkus

以下是问题的简要概述:

我想在不重新启动应用程序的情况下调用bean生命周期方法。 我需要在Quarkus和CDI / Weld中重新加载Bean时调用超类的拦截器方法(PostConstruct和PreDestroy)。

例如,我对此有一个端点:/ reload-它会触发Bean重新加载,我需要遍历所有使用我的自定义注释进行注释的bean,然后调用posconstr和predestr注释(如果存在)想保留bean的调用顺序(如果bean扩展了具有此类生命周期回调的超类,那么我想先调用它)。

我做了什么来解决它:我使用了一个反射来称呼他们。但是我认为这是一种肮脏的解决方法,希望应该有一个更明智的解决方案。有使用CDI的解决方案:

beanManager.getInjectionTargetFactory(
            beanManager.createAnnotatedType(instance.getClass())).createInjectionTarget(
            bean).postConstruct(instance)

CDI在beanManager中具有getInjectionTargetFactory,Quarkus不支持该方法。 它可以工作,但是我使用Quarkus方法搜索解决方案。

Quarkus是否可以在不重新启动应用程序的情况下调用所有bean的postConstruct和preDestroy方法?

1 个答案:

答案 0 :(得分:2)

您可以在bean上使用常规CDI注释@PostConstruct@PreDestroy。 Quarkus将尊重他们。

例如:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class MyBean {
    @PostConstruct
    void init() {
        // do something
    }

    @PreDestroy
    void destroy() {
        // do something
    }
}

请注意,它们将在bean初始化和销毁​​时调用,而不是在应用程序初始化和销毁​​时调用,为此,您可以侦听特定事件:https://quarkus.io/guides/lifecycle#listening-for-startup-and-shutdown-events