2017-12-13 3 views
1

Zum Beispiel ist HttpEncodingAutoConfiguration mit @ConditionalOnClass (CharacterEncodingFilter.class) annotiert.Wie funktioniert SpringBoot @ConditionalOnClass?

Was ich über @ConditionalOnClass weiß, ist, den CharacterEncodingFilter in classpath zu versprechen, aber wenn die Klasse nicht im Klassenpfad ist, wie könnte sie beim Kompilieren oder Laden der Klasse durchkommen.

Vielen Dank.

Antwort

2

Die javadoc auf ConditionalOnClass.value gibt die Antwort:

Die Klassen, die vorhanden sein müssen. Da diese Annotation von geladen wird Klassenklasse Bytecode, ist es sicher, Klassen hier angeben, die letztlich nicht auf dem Klassenpfad sein, nur wenn diese Annotation direkt auf der betroffenen Komponente ist und nicht, wenn diese Annotation als zusammengesetzt verwendet wird , Meta-Annotation. Um diese Annotation als Meta-Annotation zu verwenden, verwenden Sie nur das name-Attribut.

Auch bei der Kompilierung Sie solche Klassen auf dem Classpath müssen verwenden Sie das value Attribut ConditionalOnClass müssen.

Spring-Boot verwendet optionale Abhängigkeiten, um dies zu erreichen. In Maven sieht das dies wie:

<dependency> 
    <groupId>com.atomikos</groupId> 
    <artifactId>transactions-jdbc</artifactId> 
    <version>4.0.4</version> 
    <scope>compile</scope> 
    <optional>true</optional> 
</dependency> 

In gradle Sie in der Regel verwenden compileOnly dies zu erreichen.

+0

Oh, ich sehe, vielen Dank. –

Verwandte Themen