使用@RefreshScope @PostConstruct @PreDestroy进行Spring启动

时间:2017-06-08 09:27:36

标签: java spring spring-boot

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

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

任何人遇到同样的问题,这是一个错误还是“功能”?有没有办法使这项工作?

祝你好运

1 个答案:

答案 0 :(得分:1)

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

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

正如您所看到的那样,这是一个非常无意义的实现,但是这个bean上的方法调用会触发它的初始化(@PostConstruct方法)。

此行为符合documentation

  

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

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