2017-09-14 9 views
6

मैं समझता हूं कि स्प्रिंग बूट में @Conditional एनोटेशन जैसे @ConditionalOnBean, @ConditionalOnClass, @ConditionalOnProperty, ConditionalOnWebApplication हैं। लेकिन मुझे नहीं पता कि यह कैसे काम करता है?वसंत बूट में सशर्त एनोटेशन कैसे काम करता है?

उदाहरण के लिए:

@Configuration  
@ConditionalOnClass(MyBean.class) 
public class MyConfiguration{ 
    // omitted  
} 

मैं है क्या समझ में आया, MyConfiguration लोड किया जाएगा केवल अगर MyBean मेरी classpath में उपलब्ध है। लेकिन MyBean क्लास मेरे क्लास पथ में नहीं है, तो यह संकलित और चलाएगा क्योंकि संकलक @ConditionalOnClass(MyBean.class) लाइन तक पहुंचता है, क्या यह कंपाइलर त्रुटि फेंक नहीं सकता है? जैसे ही मैं अपने ग्रहण में ऐसा कोड जोड़ता हूं, मुझे संकलन समय त्रुटि मिल रही है। क्षमा करें अगर यह बहुत ही बुनियादी सवाल है लेकिन मुझे नहीं पता कि मुझे समझने में क्या गुम है।

उत्तर

6

स्प्रिंग बूट वैकल्पिक निर्भरता बहुत से संकलित की जा रही है; इसलिए जब स्प्रिंग बूट संकलित किया जाता है, तो MyBean.class कक्षापथ पर है।

अब आपके आवेदन में उसके क्लासपाथ में MyBean.class नहीं हो सकता है, लेकिन यह रनटाइम पर विफल नहीं होता है। ऐसा इसलिए है क्योंकि @ConditionalOnClass एनोटेशन को संसाधित करने वाले बुनियादी ढांचे वास्तव में कॉन्फ़िगरेशन के बाइटकोड को पढ़ेंगे और केवल MyBean.class मौजूद होने पर उन्हें लोड करेंगे। @ConditionalOnClass javadoc देखें।

अब ऑटो कॉन्फ़िगरेशन एक विस्तृत विषय है, और आप more about this in this talk सीख सकते हैं।

+0

आपकी व्याख्या और लिंक बहुत उपयोगी हैं। बहुत बहुत धन्यवाद –

0

आप आमतौर पर Optional निर्भरता का प्रयोग करेंगे:

<dependency> 
    <groupId>org.freemarker</groupId> 
    <artifactId>freemarker</artifactId> 
    <optional>true</optional> 
</dependency> 
1

Spring Boot Documentation के रूप में कहते हैं:

@ConditionalOnClass और @ConditionalOnMissingClass एनोटेशन की अनुमति देता है विन्यास उपस्थिति या विशिष्ट वर्गों के अभाव के आधार पर शामिल किया जाना है। इस तथ्य के कारण कि एनोटेशन मेटाडाटा एएसएम का उपयोग करके पार्स किया गया है, आप वास्तव में वास्तविक वर्ग को संदर्भित करने के लिए मान विशेषता का उपयोग कर सकते हैं, भले ही वह कक्षा पर चल रहे एप्लिकेशन क्लासपाथ पर दिखाई न दे। यदि आप स्ट्रिंग मान का उपयोग करके कक्षा का नाम निर्दिष्ट करना चाहते हैं तो आप नाम विशेषता का भी उपयोग कर सकते हैं।

तो वे बाईटकोड हेरफेर पुस्तकालय ASM का उपयोग रनटाइम के दौरान वर्ग के नाम पार्स करने के लिए, भले ही कक्षाएं अब और classpath पर नहीं हैं सक्षम होने के लिए। चूंकि वसंत ओपन सोर्स है, इसलिए आप annotation reading code पर भी जा सकते हैं।

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