春季启动:排除基于环境变量的自动配置

Lac*_*lev 5 java spring spring-boot

在春季启动中,我们可能会排除特定的自动配置类,这样就永远不会应用它们。基于注释的配置示例:

@SpringBootApplication(exclude = OneConfiguration.class)
Run Code Online (Sandbox Code Playgroud)

我想要为环境变量提供一个值,该值将确定一些将被排除的自动配置。有什么想法要实现吗?

小智 8

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

@SpringBootApplication(exclude = OneConfiguration.class)
Run Code Online (Sandbox Code Playgroud)

然后扩展它并使其成为有条件的:

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


Krz*_*sik 2

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

public class AutoConfigurationCondition extends Condition {

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

然后你就可以在课堂上使用它Configuration

@Configuration
@Conditional(AutoConfigurationCondition.class)
@EnableAutoConfiguration(exclude = {OneConfiguration.class})
class AutoConfigurationExcludingConf {}
Run Code Online (Sandbox Code Playgroud)

  • 恐怕这不起作用,因为 @EnableAutoConfiguration 应该只使用一次(根据文档)。我想要的是能够在两个自动配置之间动态交换。实际上,我想在两个 JMS 提供程序之间进行选择 - ActiveMQ 或 ArtemisMQ,它们可作为启动器。该应用程序部署在多个不同的环境中。也许我可能会使用配置文件,尽管我对此不太热衷。 (3认同)