java - 带有@RefreshScope @PostConstruct @PreDestroy 的 Spring 启动

标签 java spring spring-boot

在我的 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/

相关文章:

android - 如何正确实现手机客户端数据库和服务器mysql数据库之间的数据同步

java.lang.IllegalArgumentException : Cannot instantiate interface org. springframework.context.ApplicationContextInitializer

spring-boot - Rabbitmq Camel Spring 启动自动配置

java - 无法获得与 PostgreSQL 的 JDBC 连接

java - 无法通过套接字发送多条消息

java - Spring REST GET 请求生成哈希值

java - Spring 启动执行: org. apache.tomcat.util.scan.StandardJarScanner.setJarScanFilter(Lorg/apache/tomcat/JarScanFilter;V

java - 在 Coldfusion/Java 中拆分多语言字符串

java - 将 CSV 文件转换为 2D 数组 Java

spring - 在 Spring application.properties 文件中使用表达式