当一个配置文件没有被激活时,如何包含bean定义

76
在我的应用程序中,我使用几个配置文件使某些bean适合自动装配。我所缺少的是在特定配置文件未激活时使bean适合自动装配的可能性。
我考虑的最佳方法如下:
  1. 假设我们有所有可能配置文件的列表,例如 {A, B, C, D}。
  2. 针对特定执行的配置文件为 {A, C}。
  3. 我为所有未使用的可能配置文件创建人工配置文件。在此示例中,我将创建 {not_B,not_D} 配置文件。
  4. 我想要基于未激活的配置文件 X 激活的bean,我会为配置文件 not_X 激活它们。在我的情况下,如果我希望在配置文件B未激活时使bean适合自动装配,我将注释它们为 @Profile("not_B")
然而,这种解决方案需要事先了解所有可能的配置文件。
你能想到更好的解决方案吗?
1个回答

112
你可以使用非(!)运算符... 但是你必须使用Spring 3.2 M1。

The following syntax is now supported

<beans profile="A,!B">

@Profile({"A", "!B"})

indicating that the element or annotated component should be processed only if profile 'A' is active or profile 'B' is not active.

请看这里宣布的变化:Spring Framework 3.2 M1发布
提交更改在GitHub上:支持非(!)运算符进行配置文件选择
JIRA中的问题:SPR-8728
如果您的项目无法升级到Spring 3.2,我建议不使用@Profile方法,并确保在您的Spring配置中不创建该bean。

这很不错,但是Spring 3.2现在还处于RC1阶段,所以对我来说并不是一个选择。 - ShyJ
看看我对帖子的更改。我建议不要使用@Profile初始化,而是在Spring配置中处理它。 - aweigold
@Shyj 我也考虑过这个问题(例如使用排除配置来配置类路径扫描器),但那似乎不如使用配置文件来得方便。 - ShyJ
@Shyj 我完全同意...但是如果你被固定在3.1版本,那么在类路径扫描中排除它可能是最好的选择。 - aweigold
@MarcoFerrari OP([ShyJ](https://stackoverflow.com/users/1815355/shyj))最后一次出现是在2012年12月21日22:19。无论这个答案有多好,它都永远不会被接受。=( - naXa stands with Ukraine
2
我在想我们是否可以执行一个@Profile("!default", "!test")。 - ashfaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接