2016-11-25 55 views
1

我想让我的弹簧引导配置类别A依赖于另一个配置类别B,即A配置仅在评估B配置时才被评估。如何以另一种配置为条件进行配置?

在现实情况下,我有数以百计的Ai配置只有一个B,我想实现一个方法只B在测试过程中排除,排除所有Ai CONFIGS。

我试过如下:

@Configuration 
@ConditionalOnBean(type = "org.my.B") 
public class A1AutoConfiguration { 
// ... 
} 

B无条件配置类。

但是当我运行mvn spring-boot:run -Ddebug=true我看到A不会求因为B丢失。虽然B内部创建的bean在应用程序上下文中,但B本身不是。

不过,我觉得我可以让Ai配置类依赖于内部B创建咖啡豆,但我不喜欢那么多这种解决方案。

是否有更清洁(和工作)的方式来实现这种依赖机制?

+0

我不明白这里有什么问题,你让所有的Ai都依赖于B,并且没有B,因为你明确地排除了B,所以它们没有加载。这不是预期的行为吗?你想做什么? –

+0

不,他们被排除**总是**,而不仅仅是当我禁用'B'。 –

回答

2

关键是要确保事物的顺序正确。如果你不能确定B首先被评估,那么请求A仅在B存在时才适用。

数以百计的部分让我有点害怕。如果由于和B是自动配置,您可以使用以下

@AutoconfigureAfter(B.class) 
@ConditionalOnBean(B.class) 
public class A123AutoConfiguration { ...} 

如果由于和B不是自动配置,你需要确保B先处理,所以你不能依靠常规的类路径扫描对于那些。

+0

谢谢,这在我的情况下工作,但它并不总是工作。当将“A123AutoConfiguration”放置在主模块中而不是具有“spring.factory”文件的外部模块时,它无法找到B并且失败,并发生缺少bean错误。 –

+0

如果你想我可以分享一个例子来显示问题。 –

+0

如果不在类路径中,可以使用字符串。但这也很奇怪。如果我误解了它,它应该在那里,是的样本会帮助 –