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 在 A
和 B
之前初始化并在 a
和 b
完成后销毁。
实际行为
未在其实例上调用 InitHelper.close
方法。
正如@Antoniosss 在评论中提到的,监听 ApplicationReadyEvent
是一个可能的解决方案。我是这样实现的:
@EventListener(ApplicationReadyEvent.class)
public void closeMyResource(ApplicationReadyEvent event) {
InitHelper initHelper = event.getApplicationContext().getBean(InitHelper.class);
initHelper.close();
}
我有一个 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 在 A
和 B
之前初始化并在 a
和 b
完成后销毁。
实际行为
未在其实例上调用 InitHelper.close
方法。
正如@Antoniosss 在评论中提到的,监听 ApplicationReadyEvent
是一个可能的解决方案。我是这样实现的:
@EventListener(ApplicationReadyEvent.class)
public void closeMyResource(ApplicationReadyEvent event) {
InitHelper initHelper = event.getApplicationContext().getBean(InitHelper.class);
initHelper.close();
}