@ConditionalOnProperty注释的目的是什么?

use*_*583 56 spring annotations spring-boot

我只修改了spring boot配置,并遇到了

@ConditionalOnProperty(prefix = "spring.social.", value = "auto-connection-views") 
Run Code Online (Sandbox Code Playgroud)

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");
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*son 102

注释用于根据属性的配置有条件地创建Spring bean.在您在问题中显示的用法中,只有在spring.social.auto-connection-views属性存在并且其值不是的情况下才会创建bean false.这意味着,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);
}
Run Code Online (Sandbox Code Playgroud)

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


Jar*_*uba 5

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

@ConditionalOnProperty 在带有 @Configuration 的 TYPE 级别


小智 0

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

如果未在环境注释中设置该属性,则不会阻止该方法的执行。