我想创建一个Spring Boot自动配置类(有条件地)创建一个bean A。然而,挑战在于,必须在BSpringBoot的默认自动配置类之一中创建另一个bean之前创建该对象。Bean B不依赖A。
A
B
我的第一次尝试是使用@AutoConfigureBefore。根据我的预期,这种方法不起作用,从DaveSyer的评论来看,它不应该如此。
@AutoConfigureBefore
背景知识:上述bean A更改了Mongo数据库,并且必须在MongoTemplate创建之前进行。
MongoTemplate
事实证明,我想要的是动态地使实例B依赖A。这可以通过使用来实现BeanFactoryPostProcessor,以改变bean定义的B豆类。
BeanFactoryPostProcessor
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。
DependsOnPostProcessor