【问题标题】:Including bean definition when a profile is NOT active当配置文件不活动时包括 bean 定义
【发布时间】:2012-11-14 12:58:53
【问题描述】:

在我的应用程序中,我使用了几个 profiles 来使某些 bean 符合自动装配的条件。我缺少的是当某个配置文件不活动时使 bean 有资格进行自动装配的可能性。

我想到的最好的方法是这样的:

  1. 假设我们有一个所有可能配置文件的列表,例如{A、B、C、D}。
  2. 可用于特定执行的配置文件是 {A, C}。
  3. 我所做的是为所有可能的非活动配置文件创建人工配置文件。在示例情况下,我将创建 {not_B, not_D} 配置文件。
  4. 我想根据非活动配置文件X 激活的bean 我为配置文件not_X 激活。在我的情况下,如果我希望 bean 在配置文件 B 不活动时有资格进行自动装配,我会注释它们 @Profile("not_B")

但是,此解决方案需要预先了解所有可能的配置文件。

你能想出更好的解决方案吗?

【问题讨论】:

    标签: java spring spring-profiles negation


    【解决方案1】:

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

    现在支持以下语法

    <beans profile="A,!B">
    
    @Profile({"A", "!B"})
    

    表示只有在配置文件“A”处于活动状态或配置文件“B”不活动时才应处理元素或带注释的组件。

    查看此处宣布的更改:Spring Framework 3.2 M1 Released
    提交在 GitHub:Support not (!) operator for profile selection
    JIRA 中的问题:SPR-8728

    如果您的项目无法升级到 Spring 3.2,我建议不要使用 @Profile 方法并确保未在您的 Spring 配置中创建 bean。

    【讨论】:

    • 这很好,但是 Spring 3.2 现在在 RC1 中,所以这不是我的选择。
    • 查看我对帖子的更改。我建议不要使用 @Profile 进行初始化,而是在 Spring 配置中进行处理。
    • @Shyj 也想过这个问题(比如配置带有排除的类路径扫描器),但这似乎不如配置文件好......
    • @Shyj 我绝对同意...但是如果您被固定到 3.1,则在您的类路径扫描中排除可能是您的最佳选择。
    • 我想知道我们是否可以做一个@Profile("!default", "!test")
    猜你喜欢
    • 2016-05-27
    • 2017-09-23
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2019-01-29
    相关资源
    最近更新 更多