Spring Boot:在最后一次使用/初始化阶段后销毁bean

SpringBoot: Destroy bean after last use / initialization phase

我有一个 Closeable bean,我只在应用程序初始化期间使用它,但以后不会。它打开一个在初始化期间使用的资源。我希望在最后一次使用该对象后尽早调用 close 方法。是否可以自动销毁对象。

例子

@Component
@Slf4j
public class InitHelper implements Closeable {
  public InitHelper() {
    log.debug("Initialized InitHelper");
  }
  public int hello() {
    return 42;
  }
  @PreDestroy
  public void close() {
    log.debug("Closed InitHelper");
  }
}
@Configuration
public class AppConfig {
  @Bean
  public A a(InitHelper initHelper) {
    return new A(initHelper.hello());
  }

  @Bean
  public B b(InitHelper initHelper) {
    return new A(initHelper.hello());
  }
}

预期行为

一个 InitHelper bean 在 AB 之前初始化并在 ab 完成后销毁。

实际行为

未在其实例上调用 InitHelper.close 方法。

正如@Antoniosss 在评论中提到的,监听 ApplicationReadyEvent 是一个可能的解决方案。我是这样实现的:

@EventListener(ApplicationReadyEvent.class)
public void closeMyResource(ApplicationReadyEvent event) {
  InitHelper initHelper = event.getApplicationContext().getBean(InitHelper.class);
  initHelper.close();
}