一尘不染

Spring Boot自动配置顺序

spring-boot

我想创建一个Spring Boot自动配置类(有条件地)创建一个bean A。然而,挑战在于,必须在BSpringBoot的默认自动配置类之一中创建另一个bean之前创建该对象。Bean B不依赖A

我的第一次尝试是使用@AutoConfigureBefore。根据我的预期,这种方法不起作用,从DaveSyer的评论来看,它不应该如此。

背景知识:上述bean A更改了Mongo数据库,并且必须在MongoTemplate创建之前进行。


阅读 472

收藏
2020-05-30

共1个答案

一尘不染

事实证明,我想要的是动态地使实例B依赖A。这可以通过使用来实现BeanFactoryPostProcessor,以改变bean定义B豆类。

public class DependsOnPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
                beanFactory, B.class, true, false);
        for (String beanName : beanNames) {
            BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
            definition.setDependsOn(StringUtils.addStringToArray(
                    definition.getDependsOn(), "beanNameOfB");
        }
    }

}

这适用于纯Spring,不需要Spring
Boot。要完成自动配置,我需要将的bean定义添加DependsOnPostProcessor到实例化bean的配置类中A

2020-05-30