2014-09-11 18 views
8

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 ...

Odpowiedz

10

dobry połów!

można wykorzystywać na @Bean poziomie metody, ale w tym przypadku trzeba określić klasę jako dosłowne:

@Bean 
@ConditionalOnClass(name ="de.MyService") 
public MyConditionalBean statistics() { 
    return new MyConditionalBean(); 
} 

Nie pamiętam już „dlaczego”, ale jest to z istniejącego kodu Źródła Spring Boot.

+1

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. –

Powiązane problemy