spring
वसंत में सशर्त बीन पंजीकरण
खोज…
टिप्पणियों
हालत का उपयोग करते समय ध्यान देने योग्य बात
- हालत वर्ग को प्रत्यक्ष वर्ग (स्प्रिंग बीन के रूप में नहीं) के रूप में संदर्भित किया जाता है, इसलिए यह
@Value
संपत्ति इंजेक्शन का उपयोग नहीं कर सकता है अर्थात इसके भीतर कोई अन्य स्प्रिंग बीन्स इंजेक्ट नहीं किया जा सकता है। - जावा डॉक्स से - शर्तों को
BeanFactoryPostProcessor
के समान प्रतिबंधों का पालन करना चाहिए और बीन के उदाहरणों के साथ बातचीत न करने का ध्यान रखना चाहिए । यहाँ रेफरी किए गए प्रतिबंध एBeanFactoryPostProcessor
बीन परिभाषाओं के साथ बातचीत और संशोधित कर सकते हैं, लेकिन बीन के उदाहरण कभी नहीं। ऐसा करने से समय से पहले बीन इंस्टेंटेशन हो सकता है, कंटेनर का उल्लंघन हो सकता है और अनपेक्षित दुष्प्रभाव हो सकते हैं।
बीन्स को तभी पंजीकृत करें जब कोई संपत्ति या मूल्य निर्दिष्ट हो
एक वसंत सेम विन्यस्त किया जा सकता ऐसी है कि वह पंजीकृत करेंगे केवल अगर यह एक विशेष महत्व है या एक निर्धारित संपत्ति पूरा किया जाता है। ऐसा करने के लिए, संपत्ति / मूल्य की जांच करने के लिए Condition.matches
लागू करें:
public class PropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("propertyName") != null;
// optionally check the property value
}
}
जावा कॉन्फ़िगरेशन में, बीन को पंजीकृत करने के लिए एक शर्त के रूप में उपरोक्त कार्यान्वयन का उपयोग करें। @Conditional एनोटेशन के उपयोग पर ध्यान दें।
@Configuration
public class MyAppConfig {
@Bean
@Conditional(PropertyCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
PropertyCondition
, किसी भी संख्या में स्थितियों का मूल्यांकन किया जा सकता है। हालाँकि, यह सलाह दी जाती है कि उन्हें ढीला रखने के लिए प्रत्येक शर्त के लिए कार्यान्वयन को अलग किया जाए। उदाहरण के लिए:
@Configuration
public class MyAppConfig {
@Bean
@Conditional({PropertyCondition.class, SomeOtherCondition.class})
public MyBean myBean() {
return new MyBean();
}
}
शर्त एनोटेशन
मुख्य @conditional
छोड़कर, विभिन्न मामलों के लिए उपयोग किए जाने वाले समान एनोटेशन के सेट हैं।
कक्षा की स्थिति
@ConditionalOnClass
और @ConditionalOnMissingClass
एनोटेशन विशिष्ट कक्षाओं की उपस्थिति या अनुपस्थिति के आधार पर कॉन्फ़िगरेशन को शामिल करने की अनुमति देता है।
जैसे जब OObjectDatabaseTx.class
को निर्भरता में जोड़ा जाता है और कोई OrientWebConfigurer
बीन नहीं है तो हम OrientWebConfigurer
बनाते हैं।
@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
return new OrientWebConfigurer();
}
बीन की स्थिति
@ConditionalOnBean
और @ConditionalOnMissingBean
एनोटेशन किसी सेम को विशिष्ट बीन्स की उपस्थिति या अनुपस्थिति के आधार पर शामिल करने की अनुमति देते हैं। आप सेम द्वारा निर्दिष्ट करने के लिए मान विशेषता का उपयोग कर सकते हैं, या नाम से सेम निर्दिष्ट करने के लिए नाम। खोज विशेषता आपको ApplicationContext
पदानुक्रम को सीमित करने की अनुमति देती है जिसे सेम की खोज करते समय विचार किया जाना चाहिए।
उपरोक्त उदाहरण देखें जब हम जांचते हैं कि क्या कोई परिभाषित बीन नहीं है।
संपत्ति की स्थिति
@ConditionalOnProperty
एनोटेशन कॉन्फ़िगरेशन को स्प्रिंग एनवायरनमेंट प्रॉपर्टी के आधार पर शामिल करने की अनुमति देता है। उस गुण को निर्दिष्ट करने के लिए उपसर्ग और नाम विशेषताओं का उपयोग करें जिन्हें चेक किया जाना चाहिए। डिफ़ॉल्ट रूप से कोई भी संपत्ति जो मौजूद है और false
बराबर नहीं है, उसका मिलान किया जाएगा। तुम भी उपयोग करके अधिक उन्नत चेकों बना सकते हैं havingValue
और matchIfMissing
विशेषताओं।
@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean
public SomeBean someBean(){
}
संसाधन की स्थिति
@ConditionalOnResource
एनोटेशन कॉन्फ़िगरेशन को केवल तभी सम्मिलित करने की अनुमति देता है जब कोई विशिष्ट संसाधन मौजूद होता है।
@ConditionalOnResource(resources = "classpath:init-db.sql")
वेब अनुप्रयोग की स्थिति
@ConditionalOnWebApplication
और @ConditionalOnNotWebApplication
एनोटेशन कॉन्फ़िगरेशन को इस आधार पर शामिल करने की अनुमति देता है कि क्या आवेदन एक 'वेब एप्लिकेशन' है।
@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}
स्पेल अभिव्यक्ति की स्थिति
@ConditionalOnExpression
एनोटेशन कॉन्फ़िगरेशन को स्पेल अभिव्यक्ति के परिणाम के आधार पर शामिल करने की अनुमति देता है।
@ConditionalOnExpression("${rest.security.enabled}==false")