Jak dokładnie działa adnotacja @ConditionalOnClass
?Jak działa spring-boot @ConditionalOnClass?
Moim celem jest załadowanie określonego komponentu bean tylko wtedy, gdy klasa jar
zawiera tę klasę.
I chociaż mogłyby I adnotacji do @Bean
z @ConditionalOnClass(MyService.class)
i deklarując zależność w Maven jako opcjonalne:
<dependency>
<groupId>de.my</groupId>
<artifactId>my-framework<artifactId>
<optional>true</optional>
</dependency>
@Bean
@ConditionalOnClass(MyService.class)
public MyConditionalBean statistics() {
return new MyConditionalBean();
}
Teraz każdy mający my-framework
jako zależność powinna dostać że fasola automatycznie przewodowego. Ale każdy, kto nie ma zależności, powinien ją pominąć.
Ale kiedy uruchomić aplikację, pojawia się następujący błąd:
Caused by: java.lang.ClassNotFoundException: de.MyService.class
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) ~[catalina.jar:7.0.50]
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ~[catalina.jar:7.0.50]
Więc jestem prawdopodobnie robi coś złego. Jak mogę utworzyć komponent bean w zależności od jarów zależności i klas zawartych w ścieżce klas?
Od docs wiosennych:
/**
* The classes that must be present. Since this annotation parsed by loading class
* bytecode it is safe to specify classes here that may ultimately not be on the
* classpath.
*/
ale błąd twierdzi inaczej ...
Jeśli umieścisz go w klasie najwyższego poziomu, to oprócz tego, że klasa będzie wciągnięta w czasie ładowania klasy. To jest, gdy korzystasz z klasy. Używanie go jako literału łańcuchowego zapobiega temu. –