2014-09-11 52 views
8

@ConditionalOnClass ek açıklaması nasıl çalışır?Spring-boot @ConditionalOnClass nasıl çalışır?

Amacım, belirli bir fasulyeyi yalnızca bu sınıfı sağlayan jar sınıf yoluna dahil edilmişse yüklemektir.

ben @ConditionalOnClass(MyService.class) ile @Bean açıklama ve isteğe bağlı olarak maven içinde bağımlılık ilan gerçi: bağımlılık olarak

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

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

Artık herkes sahip my-framework o fasulye otomatik kablolu almalısınız. Ama bağımlılığa sahip olmayan herkes onu atlamalı. Yani muhtemelen yanlış bir şey yapıyorum

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] 

: Ben app başlattığınızda

Ama aşağıdaki hatayı alıyorum. Daha sonra, bağımlılık kavanozlarına ve sınıf yolunda yer alan sınıflara baklaya nasıl katılabilirim?

bahar Dokümanlar

:

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

Ama hata farklı devletler ...

cevap

10

İyi tutuş!

Sen @Bean yöntem düzeyde kullanabilir ancak bu durumda siz Değişmez sınıfını belirtmek zorundayım: Ben hatırlamak yok

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

zaten "neden", ancak mevcut bir koddan olduğunu Bahar Önyükleme kaynakları.

+1

En üst düzey bir sınıfa koyarsanız, sınıfın sınıf yükleme süresinde çekilmesi dışında olurdum. Sınıfı kullanırken budur. Bunu bir String literal olarak kullanmak bunu engeller. –