【问题标题】:Spring boot with @RefreshScope @PostConstruct @PreDestroy使用@RefreshScope @PostConstruct @PreDestroy 进行春季启动
【发布时间】:2017-06-08 09:27:36
【问题描述】:

在我的 Spring boot 应用程序中,我们利用 @RefreshScope 在配置更改后动态重新加载 bean。它可以工作,但是在将 bean 上的 @RefreshScope 与注释为 @PostConstruct@PreDestroy 的方法结合时遇到了一个问题。刷新后似乎没有调用@PostConstruct

启动应用时,@PostConstruct 方法被正常调用。调用刷新时,@PreDestroy 方法也会正常调用,我希望在新的代理 bean 实例上调用@PostConstruct,但事实并非如此。这些方法中有重要的初始化/销毁逻辑,因此不调用它们是一个问题。

有人遇到过同样的问题,这是错误还是“功能”?有没有办法让这个工作?

最好的问候

【问题讨论】:

  • 如何调用刷新?使用 url /refresh 或以编程方式!?
  • 嗨,我使用 /refresh 和/或 /bus/refresh 端点。我想后者只是在接收到消息时在内部运行 /refresh。

标签: java spring spring-boot


【解决方案1】:

我今天遇到了同样的问题,并且能够通过在刷新后调用 @RefreshScope'd bean 上的方法来解决它。为此,我为受影响的 bean 添加了 RefreshScopeRefreshedEvent 的事件处理程序:

@EventListener
public void onRefreshScopeRefreshed(final RefreshScopeRefreshedEvent event) {
    getClass();
}

如您所见,这是一个毫无意义的实现,但是这个对 bean 的方法调用触发了它的初始化(@PostConstruct 方法)。

此行为符合documentation:

刷新范围 bean 是惰性代理,它们在使用时(即调用方法时)进行初始化,

但我仍然认为这确实是一个错误,应该在刷新后自动调用 @PostConstruct

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2016-05-08
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 2017-06-18
    • 2017-12-04
    相关资源
    最近更新 更多