告诉 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 方法的问题。