在应用程序关闭时,每个单例bean都被defaultlistablebeanfactory . destroysingleton()销毁。如果bean有一个名为shutdown的公共void无参数方法,那么它将被调用。我有一些第三方bean,它们都实现了一个特定的接口,让我们称之为DoNotDestroy,我不想让Spring销毁它。
我可以在每个bean上指定一个空白字符串销毁方法,如下所示:
@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方法的问题。