告诉 Spring 不要对特定类型的 bean 调用关闭
Tell Spring not to invoke shutdown on beans of a specific type
在应用程序关闭时,每个单例 bean 都被 DefaultListableBeanFactory.destroySingletons() 销毁。
如果 bean 有一个名为 shutdown 的 public void no-arg 方法,那么它将被调用。
我有一些第 3 方 bean,它们都实现了某个接口,我们称它为 DoNotDestroy,我不想 Spring 销毁它。
我可以在每个 bean 上指定一个空白字符串 destroy 方法,如下所示:
@Bean(destroyMethod = "")
public MyBean myBean() {
return new MyBean();
}
但是,我更愿意以某种方式配置 Spring 以不销毁任何实现 DoNotDestroy 的 bean。有什么好的方法吗?
我可以实现一个 BeanFactoryPostProcessor 来做同样的事情,而不是取消每个 @Bean 方法中的 destroy 方法:
@Component
public class DoNotDestroyPostProcessor implements BeanFactoryPostProcessor {
private final Logger log = LoggerFactory.getLogger(DoNotDestroyPostProcessor.class);
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] doNotDestroys = beanFactory.getBeanNamesForType(DoNotDestroy.class);
for (String doNotDestroy : doNotDestroys) {
BeanDefinition bean = beanFactory.getBeanDefinition(doNotDestroy);
log.info("Don't destroy bean {} {}", bean.getFactoryMethodName(), bean.getDestroyMethodName());
bean.setDestroyMethodName("");
}
}
}
这避免了某人添加一个 bean 而忘记清空 destroy 方法的问题。
在应用程序关闭时,每个单例 bean 都被 DefaultListableBeanFactory.destroySingletons() 销毁。 如果 bean 有一个名为 shutdown 的 public void no-arg 方法,那么它将被调用。 我有一些第 3 方 bean,它们都实现了某个接口,我们称它为 DoNotDestroy,我不想 Spring 销毁它。
我可以在每个 bean 上指定一个空白字符串 destroy 方法,如下所示:
@Bean(destroyMethod = "")
public MyBean myBean() {
return new MyBean();
}
但是,我更愿意以某种方式配置 Spring 以不销毁任何实现 DoNotDestroy 的 bean。有什么好的方法吗?
我可以实现一个 BeanFactoryPostProcessor 来做同样的事情,而不是取消每个 @Bean 方法中的 destroy 方法:
@Component
public class DoNotDestroyPostProcessor implements BeanFactoryPostProcessor {
private final Logger log = LoggerFactory.getLogger(DoNotDestroyPostProcessor.class);
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String[] doNotDestroys = beanFactory.getBeanNamesForType(DoNotDestroy.class);
for (String doNotDestroy : doNotDestroys) {
BeanDefinition bean = beanFactory.getBeanDefinition(doNotDestroy);
log.info("Don't destroy bean {} {}", bean.getFactoryMethodName(), bean.getDestroyMethodName());
bean.setDestroyMethodName("");
}
}
}
这避免了某人添加一个 bean 而忘记清空 destroy 方法的问题。