Spring启动:根据环境变量排除自动配置

时间:2017-11-30 13:35:05

标签: java spring spring-boot

在spring boot中,我们可能会排除特定的自动配置类,以免永远不会应用它们。基于注释的配置示例:

@SpringBootApplication(exclude = OneConfiguration.class)

我想要的是提供一个环境变量,其值将决定一些将被排除的自动配置。任何想法如何实现?

3 个答案:

答案 0 :(得分:2)

创建扩展环境变量的Condition检查值的类:

public class AutoConfigurationCondition extends Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return System.getenv("EXCLUDE").equals("yes");
     }
}

然后你可以在Configuration class:

中使用它
@Configuration
@Conditional(AutoConfigurationCondition.class)
@EnableAutoConfiguration(exclude = {OneConfiguration.class})
class AutoConfigurationExcludingConf {}

答案 1 :(得分:2)

您可以默认排除此配置类:

@SpringBootApplication(exclude = OneConfiguration.class)

然后将其扩展并使其视情况而定:

@Configuration
@ConditionalOnProperty(name = "one.configuration.condtion", havingValue = "some-value")
public class OneConfigurationConditional extends OneConfiguration { }

答案 2 :(得分:1)

我设法用个人资料做了我想要的事情:-(所以我现在几乎没有文件 - 例如application-artemis.yamlapplication-activemq.yaml。我在每个文件中都定义了相应的spring.autoconfigure.exclude {{3我对这个解决方案并不感到自豪,虽然它到目前为止工作得很好,与我做的其他事情相比看起来或多或少整洁:-)。

除此之外我还尝试过:

  1. 使用环境变量管理值,例如:
  2. spring:
      autoconfigure:
        exclude: ${ABC:com.example.Myautoconfiguration}
    

    这不起作用,我甚至将其报告为property。但似乎我不能依赖表达这个属性。奇怪的是它适用于其他属性......

    1. 我已经开始讨论@Randal Flagg的建议但不知何故我无法启动并运行 - 我正在使用@SpringBootApplication,文档说我只能使用EnableAutoConfiguration一次等等。

    2. 我尝试使用自己的TypeFilter,但这也不是一个选项 - 自动配置在组件扫描期间有特殊处理,并且设计在那里看起来似乎不太可扩展。至少我找不到一个很好的插件方式。