Was ist der Zweck der Annotation @ConditionalOnProperty?

73

Ich habe gerade die Spring Boot-Konfiguration geändert und bin darauf gestoßen

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

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

Ich verstehe den Zweck dieser Anmerkung nicht. Ich denke, dies könnte die Verwendung von Bean nur ermöglichen, wenn ein Eigenschaftswert vorhanden ist (z. B. "spring.social", "auto-connection-views").

user3409583
quelle

Antworten:

126

Die Annotation wird verwendet, um abhängig von der Konfiguration einer Eigenschaft eine Spring Bean bedingt zu erstellen. In der Verwendung, die Sie in der Frage gezeigt haben, wird die Bean nur erstellt, wenn die spring.social.auto-connection-viewsEigenschaft vorhanden ist und einen anderen Wert als hat false. Dies bedeutet, dass Sie zum ViewErstellen dieser Bean die spring.social.auto-connection-viewsEigenschaft festlegen müssen und einen anderen Wert als false haben müssen.

Sie können zahlreiche andere Verwendungen dieser Anmerkung in der gesamten Spring Boot-Codebasis finden. Ein weiteres Beispiel ist:

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

Beachten Sie die Verwendung von matchIfMissing. In diesem Fall wird die AmqpAdminBean erstellt, wenn die spring.rabbitmq.dynamicEigenschaft vorhanden ist und einen anderen Wert als hat false oder die Eigenschaft überhaupt nicht vorhanden ist. Dies führt dazu, dass das Bean-Opt-Out erstellt wird und nicht das Beispiel in der Frage, bei der es sich um Opt-In handelt.

Andy Wilkinson
quelle
5

Wenn Sie diese Eigenschaft auf TYPE-Ebene verwenden, dh in einer Ihrer @ Configuration-Klassen ... Beachten Sie, dass in diesem Fall die Annotation anhand der Standardeigenschaftendatei ausgewertet / überprüft wird, d. H. application.properties

@ConditionalOnProperty auf TYPE-Ebene mit @Configuration

Jaroslav Záruba
quelle
0

Es ist eher das Gegenteil. Eine Voraussetzung für die Implementierung der Methode, wenn die Eigenschaft in der Umgebung festgelegt ist (Entwicklung, Genehmigung, Produktion) und mit der Methode ein echter Wert ist, kann ausgeführt werden.

Wenn die Eigenschaft nicht in der Umgebungsanmerkung festgelegt ist, wurde die Ausführung der Methode nicht verhindert.

Anderson Marques
quelle
Ich denke, Sie haben dies auf verwirrende Weise ausgedrückt. Ich denke, Englisch ist nicht Ihre natürliche Sprache (Pt?). Ich verwende Google Translate und gebe das erste Ergebnis durch die Übersetzung zurück. Wenn es Müll ist, vereinfache ich das Original und versuche es erneut, bis wieder etwas OK auftaucht. Könnten Sie bitte auch ein Beispiel für die Verwendung zum Ausführen der verschiedenen von Ihnen erwähnten Umgebungen angeben?
Bill Woodger
Du hast Recht. Ich bin Brasilianer und kann nicht gut schreiben.
Anderson Marques
Dies könnte Sie interessieren, wenn Sie nichts davon wissen. pt.stackoverflow.com . Es gab dort nur ein paar Mainframe-Fragen, aber Sie haben auch andere Erfahrungen. Mein Portugiesisch ist ziemlich schlecht, deshalb benutze ich Google Translate und bekomme viel Hilfe von den guten Leuten dort.
Bill Woodger
Wenn Sie mit dieser Frage ein kurzes Codebeispiel bereitstellen können, um zu zeigen, was Sie meinen, kann ich den Text bearbeiten.
Bill Woodger