在我的 Spring boot 应用程序中,我们利用 @RefreshScope
在配置更改后动态重新加载 bean。它有效,但我在将 bean 上的 @RefreshScope
与注释为 @PostConstruct
和 @PreDestroy
的方法组合时遇到了问题。刷新后似乎未调用 @PostConstruct
。
当启动应用程序时,@PostConstruct
方法被正常调用。调用刷新时,@PreDestroy
方法也会正常调用,我希望 @PostConstruct
在新的代理 bean 实例上被调用,但事实并非如此。这些方法中有重要的初始化/销毁逻辑,所以不调用它们是一个问题。
有人遇到过同样的问题,这是错误还是“功能”?有什么办法可以做到这一点吗?
最好的问候
最佳答案
我今天遇到了同样的问题,并且能够通过在刷新后调用 @RefreshScope
的 bean 上的方法来解决它。为此,我为受影响的 bean 添加了 RefreshScopeRefreshedEvent
的事件处理程序:
@EventListener
public void onRefreshScopeRefreshed(final RefreshScopeRefreshedEvent event) {
getClass();
}
如您所见,这是一个毫无意义的实现,但是尽管如此,对 bean 的这个方法调用会触发它的初始化(@PostConstruct
方法)。
此行为符合 documentation :
Refresh scope beans are lazy proxies that initialize when they are used (i.e. when a method is called),
但我仍然认为这确实是一个错误,@PostConstruct
应该在刷新后自动调用。
关于java - 带有@RefreshScope @PostConstruct @PreDestroy 的 Spring 启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44431760/