告诉spring不要在特定类型的bean上调用shutdown

b4qexyjb  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(332)

在应用程序关闭时,每个单例bean都会被defaultlistablebeanfactory.destroysingletons()销毁。如果bean有一个名为shutdown的public void no arg方法,那么将调用它。我有一些第三方bean,它们都实现了一个特定的接口,我们称之为donotdestroy,我不希望spring破坏它。
我可以在每个bean上指定一个空字符串销毁方法,如下所示:

@Bean(destroyMethod = "")
public MyBean myBean() {
    return new MyBean();
}

不过,我更希望以某种方式配置spring,使其不销毁任何实现donotdestroy的bean。有什么好办法吗?

dluptydi

dluptydi1#

我可以实现一个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方法的问题。

相关问题