2014-09-11 12 views
8

@ConditionalOnClass एनोटेशन कार्य वास्तव में कैसे करता है?कैसे वसंत-बूट @ConditionalOnClass काम करता है?

मेरा लक्ष्य केवल एक विशिष्ट बीन लोड करना है यदि jar इस वर्ग को क्लासपाथ में शामिल किया गया है।

मैं हालांकि मैं @ConditionalOnClass(MyService.class) के साथ एक @Bean व्याख्या और वैकल्पिक के रूप में Maven में निर्भरता की घोषणा कर सकता है:

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

तो मैं शायद कुछ गलत कर रहा हूँ:

लेकिन जब मैं अनुप्रयोग शुरू, मैं निम्नलिखित त्रुटि मिलती है। फिर मैं निर्भरता जार और कक्षापथ में निहित कक्षाओं पर बीन सशर्त कैसे बना सकता हूं?

वसंत डॉक्स से

:

/** 
* 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(); 
} 

मुझे याद नहीं है पहले से ही "क्यों", लेकिन इसके बारे में एक मौजूदा कोड से है वसंत बूट स्रोत।

+1

यदि आप इसे शीर्ष स्तर की कक्षा में डालते हैं तो मैं क्लास लोडिंग समय पर कक्षा को खींचने के अलावा छोड़ दूंगा। वह कक्षा का उपयोग करते समय है। स्ट्रिंग शाब्दिक के रूप में इसका उपयोग करना इसे रोकता है। –

संबंधित मुद्दे