如何解决告诉 Spring 不要对特定类型的 bean 调用关闭
在应用程序关闭时,每个单例 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 方法的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。