问题描述
在应用程序关闭时,每个单例 bean 被 DefaultListablebeanfactory.destroySingletons() 销毁。 如果 bean 有一个称为 shutdown 的 public void no-arg 方法,那么它将被调用。 我有一些 3rd 方 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 方法的问题。