web-dev-qa-db-ja.com

@ConditionalOnPropertyアノテーションの目的は何ですか?

スプリングブート構成を変更したところ、

@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")。

55
user3409583

注釈は、プロパティの構成に応じて、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プロパティが存在し、AmqpAdmin以外の値を持つ場合、false Beanが作成されますまたはプロパティはまったく存在しません。これにより、オプトインである質問の例ではなく、Beanのオプトアウトが作成されます。

97
Andy Wilkinson

TYPEレベル、つまり@Configurationクラスのいずれかでこのプロパティを使用している場合...このような場合、アノテーションはデフォルトのプロパティファイル、つまりapplication.propertiesに対して評価/チェックされることに注意してください。

@ Configuration付きのTYPEレベルの@ConditionalOnProperty

3

むしろ、反対です。プロパティが環境(開発、承認、生産)で設定され、メソッドで真の値である場合、メソッドを実装するための前提条件を実行できます。

プロパティが環境アノテーションで設定されていない場合、メソッドの実行は妨げられません。

0