web-dev-qa-db-fra.com

Quel est le but de l'annotation @ConditionalOnProperty?

Je viens de modifier la configuration de démarrage de printemps, et rencontré

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

de 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");
}

Je ne comprends pas le but de cette annotation. Je suppose que cela pourrait permettre d’utiliser le bean uniquement s’il existe une valeur de propriété (par exemple, "spring.social", "auto-connection-views").

55
user3409583

L'annotation est utilisée pour créer de manière conditionnelle un bean Spring en fonction de la configuration d'une propriété. Dans l'utilisation que vous avez montrée dans la question, le bean ne sera créé que si le spring.social.auto-connection-views La propriété existe et a une valeur autre que false. Cela signifie que, pour que ce bean View soit créé, vous devez définir le paramètre spring.social.auto-connection-views propriété et il doit avoir une valeur autre que false.

Vous pouvez trouver de nombreuses autres utilisations de cette annotation dans la base de code Spring Boot. Un autre exemple est:

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

Notez l'utilisation de matchIfMissing. Dans ce cas, le bean AmqpAdmin sera créé si le spring.rabbitmq.dynamic La propriété existe et a une valeur autre que falseo la propriété n'existe pas du tout. Cela rend la création du bean opt-out plutôt que l'exemple de la question qui est opt-in.

97
Andy Wilkinson

Si vous utilisez cette propriété au niveau TYPE, c'est-à-dire sur l'une de vos classes @Configuration ... Gardez à l'esprit que, dans ce cas, l'annotation est évaluée/vérifiée par rapport au fichier de propriétés par défaut, c'est-à-dire application.properties

@ ConditionalOnProperty au niveau TYPE w/@Configuration

3
Jaroslav Záruba

C'est plutôt le contraire. Une condition préalable à la mise en œuvre de la méthode, si la propriété est définie dans l'environnement (développement, approbation, production) et que sa valeur est vraie avec la méthode peut être exécutée.

Si la propriété n'est pas définie dans l'environnement, l'annotation n'empêche pas l'exécution de la méthode.

0
Anderson Marques