2010-06-29 14 views
11

का उपयोग कर मैं एक ValidatorFactory जो मुझे अपने प्रकार के आधार पर एक सत्यापनकर्ता दे देंगेसशर्त वसंत

public Validator getNewValidator(ValidatorType type){ 

    switch: 
     case a : new Validator1(); 
     break; 
      case b : new Validator2(); 
     break; 

} 

मैं वसंत एक्सएमएल सेम परिभाषा

का उपयोग कर रहा विधि इंजेक्शन का उपयोग कर सकते लिखना चाहते हैं लिखने के लिए कोशिश कर रहा हूँ सेम लेकिन यह मुझे केवल एक ऑब्जेक्ट बनाने देगा और विधि

कोई तर्क नहीं लेती है।

मैं FactoryBean का उपयोग नहीं करना चाहते हैं .. मैं बस देख रहा हूँ हम वसंत एक्सएमएल का उपयोग कर

सेम परिभाषा यह कर सकते हैं या नहीं।

+0

आप फैक्टरीबीन का उपयोग क्यों नहीं करना चाहते हैं? –

+0

इस तरह का कोई कारण नहीं है .. मैं बस जानना चाहता हूं कि सशर्त बीन्स बनाने का कोई तरीका है .. जिज्ञासा से बाहर – Shekhar

+0

यह वही है जो 'फैक्ट्रीबीन' है।यह लड़ाई मत करो :) – skaffman

उत्तर

2

जटिल मामलों के लिए (एक खुलासा से अधिक जटिल), Spring JavaConfig आपका मित्र हो सकता है।

+0

का उपयोग कर मेरा उत्तर downvoting से पहले करना है, इसकी तिथि की जाँच करें है। स्प्रिंग JavaConfig बहुत बड़े पैमाने पर अभी तक 2010 – jplandrain

21

आप सादे एक्सएमएल के साथ सशर्त बीन इंजेक्शन कर सकते हैं। "रेफरी" विशेषता संपत्ति गुणों से संपत्ति गुणों से ट्रिगर की जा सकती है और इस प्रकार संपत्ति मूल्यों के आधार पर सशर्त बीन्स बना सकती है। यह सुविधा दस्तावेज नहीं है लेकिन यह सही काम करता है।

<bean id="validatorFactory" class="ValidatorFactory"> 
<property name="validator" ref="${validatorType}" /> 
</bean> 

<bean id="validatorTypeOne" class="Validator1" lazy-init="true" /> 
<bean id="validatorTypeTwo" class="Validator2" lazy-init="true" /> 

और संपत्ति फ़ाइल की सामग्री होगा:

validatorType = validatorTypeOne

अपने xml में संपत्ति फ़ाइल का उपयोग करने के लिए बस अपने वसंत config

के शीर्ष करने के लिए इस संदर्भ जोड़
<context:property-placeholder location="classpath:app.properties" /> 
+0

में नहीं था बस मैं कैसे कर सकता है XML कोड में validatorType = validatorTypeOne पर थोड़ा और अधिक स्पष्टीकरण की आवश्यकता है? – huahsin68

+1

validatorType = validatorTypeOne एक संपत्ति फ़ाइल में सामग्री है और वाक्य रचना $ {validatorType} संपत्ति जो इस मामले में है के मूल्य के विस्तार हो जाता है: validatorTypeOne। चूंकि यह एक बीन संदर्भ आईडी को इंगित करता है क्लास Validator1 का एक उदाहरण बनाया जाता है और ValidatorFactory में संपत्ति को सौंपा जाता है। समझ गया? – guido

+0

नहीं, मैं कथन सत्यापनकर्ता टाइप = validatorTypeOne पर थोड़ा उलझन में हूँ। अगर मुझे वैधता टाइप करने की आवश्यकता है तो क्या होगा? और मुझे ref = "$ {validatorType}" पर वाक्यविन्यास त्रुटि भी मिली। मुझे इस रेफरी चीज़ पर कुछ संदर्भ चाहिए ताकि मैं इसे स्पष्ट रूप से समझ सकूं। – huahsin68

0

ऐसा करने के लिए सक्षम होना चाहिए:

<bean id="myValidator" factory-bean="validatorFactory" factory-method="getNewValidator" scope="prototype"> 
    <constructor-arg><ref bean="validatorType"/></constructor-arg> 
</bean> 

<bean id="validatorType" ... /> 

बेशक, यह नीचे स्वचालित रूप से कॉन्फ़िगर किए गए FactoryBean का उपयोग करता है लेकिन आप अपने कोड में किसी स्प्रिंग निर्भरता से बचते हैं।

1

आप एनोटेशन उपयोग कर रहे हैं (@Autowired, @Qualifier आदि) एक्सएमएल के बजाय, आप (कम से कम वर्तमान संस्करण 3 पर) का सशर्त सेम काम करने के लिए सक्षम नहीं हैं। इस वजह से @Qualifier नहीं समर्थन अभिव्यक्ति करता

@Qualifier(value="${validatorType}") 

अधिक जानकारी मैं एक थोड़ा अलग आवश्यकताओं था https://stackoverflow.com/a/7813228/418439

1

में है। मेरे मामले में मैं उत्पादन में एन्कोडेड पासवर्ड बनाना चाहता था लेकिन विकास में सादा पाठ चाहता था। इसके अलावा, मेरे पास पैरेंट बीन parentEncoder तक पहुंच नहीं थी। इस तरह मुझे लगता है कि लक्ष्य को हासिल करने में कामयाब रहे है:

<bean id="plainTextPassword" class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder"/> 
<bean id="shaPassword" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> 
    <constructor-arg type="int" value="256"/> 
</bean> 

<bean id="parentEncoder" class="org.springframework.aop.framework.ProxyFactoryBean"> 
    <property name="targetSource"> 
    <bean class="org.springframework.aop.target.HotSwappableTargetSource"> 
     <constructor-arg ref="${password.encoding}Password"/> 
    </bean> 
    </property> 
</bean> 

बेशक

, मैं sha या plainText के रूप में संभव मूल्यों के साथ एक संपत्ति फ़ाइल में password.encoding परिभाषित किया।