2014-09-11 2 views
8

Как точно работает аннотация @ConditionalOnClass?Как работает spring-boot @ConditionalOnClass?

Моя цель - загрузить конкретный компонент только в том случае, если jar, обеспечивающий этот класс, включен в путь к классам.

я, хотя я мог аннотировать @Bean с @ConditionalOnClass(MyService.class) и объявить зависимость в мавена как опционно:

<dependency> 
    <groupId>de.my</groupId> 
    <artifactId>my-framework<artifactId> 
    <optional>true</optional> 
</dependency> 

@Bean 
@ConditionalOnClass(MyService.class) 
public MyConditionalBean statistics() { 
    return new MyConditionalBean(); 
} 

Теперь любой человек, имеющий my-framework в зависимости должны получить, что боб автоматически подключается. Но любой, у кого нет зависимости, должен пропустить это.

Но когда я запустить приложение, я получаю следующее сообщение об ошибке:

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] 

Так что я, вероятно, делать что-то неправильно. Как я могу затем создать компонент bean в зависимости от банок зависимости и классов, содержащихся в пути к классам?

С весны документы:

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

Но ошибка заявляет разные ...

ответ

10

Хороший улов!

Вы можете использовать на @Bean уровне методы, но в этом случае вы должны указать свой класс как буквальный:

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

Я не помню уже «почему», но из существующего кода Источники Spring Boot.

+1

Если вы поместили его в класс верхнего уровня, я бы за исключением класса, который нужно было бы набрать во время загрузки класса. То есть при использовании класса. Использование этого в качестве строкового литерала предотвращает это. –

Смежные вопросы