在我的Spring启动应用程序中,我们利用@RefreshScope
在配置更改后动态重新加载bean。它有效,但在将@RefreshScope
bean与注释为@PostConstruct
和@PreDestroy
的方法结合使用时遇到了问题。似乎在刷新后没有调用@PostConstruct
。
启动应用时,会正常调用@PostConstruct
方法。在调用refresh时,@PreDestroy
方法也会被正常调用,我希望在新的代理bean实例上调用@PostConstruct
,但事实并非如此。这些方法中有重要的init / destroy-logic,因此不要调用它们是一个问题。
任何人遇到同样的问题,这是一个错误还是“功能”?有没有办法使这项工作?
祝你好运
答案 0 :(得分:1)
我今天遇到了同样的问题,并且能够通过在刷新后调用@RefreshScope
'bean上的方法来解决它。为此,我向受影响的bean添加了RefreshScopeRefreshedEvent
的事件处理程序:
@EventListener
public void onRefreshScopeRefreshed(final RefreshScopeRefreshedEvent event) {
getClass();
}
正如您所看到的那样,这是一个非常无意义的实现,但是这个bean上的方法调用会触发它的初始化(@PostConstruct
方法)。
此行为符合documentation:
刷新范围bean是在使用它们时初始化的惰性代理(即调用方法时),
但我仍然认为它确实是一个错误,刷新后应该自动调用@PostConstruct
。