@ConditionalOnProperty 注释的目的是啥?

Posted

技术标签:

【中文标题】@ConditionalOnProperty 注释的目的是啥?【英文标题】:What is purpose of @ConditionalOnProperty annotation?@ConditionalOnProperty 注释的目的是什么? 【发布时间】:2014-12-11 06:02:56 【问题描述】:

刚刚修改了spring boot的配置,遇到了

@ConditionalOnProperty(prefix = "spring.social.", value = "auto-connection-views") 

来自org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration

@Bean(name =  "connect/twitterConnect", "connect/twitterConnected" )
@ConditionalOnProperty(prefix = "spring.social.", value = "auto-connection-views")
public View twitterConnectView() 
    return new GenericConnectionStatusView("twitter", "Twitter");

我不明白这个注释的目的。我猜这可能只有在属性值存在时才能使用 bean(例如“spring.social”、“auto-connection-views”)。

【问题讨论】:

【参考方案1】:

注解用于根据属性的配置有条件地创建 Spring bean。在您在问题中显示的用法中,只有spring.social.auto-connection-views 属性存在并且它的值不是false 时才会创建bean。这意味着,要创建这个 View bean,您需要设置 spring.social.auto-connection-views 属性,并且它必须具有非 false 的值。

您可以在整个 Spring Boot 代码库中找到此注解的许多其他用途。另一个例子是:

@ConditionalOnProperty(prefix = "spring.rabbitmq", name = "dynamic", matchIfMissing = true)
public AmqpAdmin amqpAdmin(CachingConnectionFactory connectionFactory) 
    return new RabbitAdmin(connectionFactory);

注意matchIfMissing 的使用。在这种情况下,如果spring.rabbitmq.dynamic 属性存在并且具有除false 以外的值该属性根本不存在,则将创建AmqpAdmin bean。这使得 bean 的创建选择退出,而不是问题中选择加入的示例。

【讨论】:

【参考方案2】:

如果您在 TYPE 级别使用此属性,即在您的 @Configuration 类之一上...请记住,在这种情况下,注释会根据默认属性文件进行评估/检查,即 application.properties

@ConditionalOnProperty on TYPE level w/ @Configuration

【讨论】:

【参考方案3】:

恰恰相反。实现该方法的前提条件是,如果该属性在环境中设置(开发、批准、生产)并且是该方法的真值,则可以执行该属性。

如果没有在环境注解中设置属性,则不会阻止方法的执行。

【讨论】:

我认为您以一种令人困惑的方式表达了这一点。我猜英语不是你的自然语言(Pt?)。我使用谷歌翻译,并通过翻译反馈第一个结果。如果是垃圾,我会简化原件并重试,直到再次出现OK。您能否提供一个用于运行您提到的不同环境的示例? 你是对的。我是巴西人,不擅长写作。 如果您不了解它,您可能会对它感兴趣。 pt.***.com。那里只有几个大型机问题,但您也有其他经验。我的葡萄牙语很烂,所以我使用谷歌翻译并从那里的好人那里得到了很多帮助。 有了这个问题,如果你能提供一个简短的代码示例来说明你的意思,我可以编辑文本。

以上是关于@ConditionalOnProperty 注释的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

@ConditionalOnProperty注解

Spring ConditionalOnProperty 用于外部属性

@RefreshScope 和 @ConditionalOnProperty 不起作用

@ConditionalOnProperty注解使用

Spring ConditionalOnProperty 无法读取 custom.properties 文件中的属性

SpEL @ConditionalOnProperty 字符串属性为空或 null