Java 带有@RefreshScope@PostConstruct@PreDestroy的弹簧靴
在我的Spring boot应用程序中,我们利用Java 带有@RefreshScope@PostConstruct@PreDestroy的弹簧靴,java,spring,spring-boot,Java,Spring,Spring Boot,在我的Spring boot应用程序中,我们利用@RefreshScope在配置更改后动态重新加载bean。它是有效的,但我在将bean上的@RefreshScope与注释的@PostConstruct和@PreDestroy方法相结合时遇到了一个问题。刷新后似乎没有调用@PostConstruct 启动应用程序时,通常会调用@PostConstruct方法。调用refresh时,@PreDestroy方法也会被正常调用,我希望在新的代理bean实例上调用@PostConstruct,但事实并非
@RefreshScope
在配置更改后动态重新加载bean。它是有效的,但我在将bean上的@RefreshScope
与注释的@PostConstruct
和@PreDestroy
方法相结合时遇到了一个问题。刷新后似乎没有调用@PostConstruct
启动应用程序时,通常会调用@PostConstruct
方法。调用refresh时,@PreDestroy
方法也会被正常调用,我希望在新的代理bean实例上调用@PostConstruct
,但事实并非如此。在这些方法中有重要的init/destroy逻辑,所以不调用它们是一个问题
任何人都会遇到同样的问题,这是一个bug还是一个“特性”?有办法使这项工作成功吗
致以最诚挚的问候我今天遇到了同样的问题,在刷新后通过调用
@RefreshScope
'd bean上的一个方法解决了这个问题。为了实现这一点,我为受影响的bean添加了RefreshScopeRefreshedEvent
的事件处理程序:
@EventListener
public void onRefreshScopeRefreshed(final RefreshScopeRefreshedEvent event) {
getClass();
}
正如您所看到的,这是一个毫无意义的实现,但是这个方法调用bean会触发它的初始化(@PostConstruct
方法)
这种行为符合以下原则:
刷新范围bean是惰性代理,在使用它们时(即调用方法时)进行初始化
但我仍然认为这确实是一个bug,刷新后应该自动调用
@PostConstruct
。如何调用刷新?使用url/refresh
或以编程方式!?您好,我使用/refresh和/或/bus/refresh端点。我认为后者只是在接收消息时在内部运行/refresh。