2012-05-15 33 views
7

मान लें कि मेरे पास एक कन्स्ट्रक्टर वाला वर्ग है जो एक या अधिक तर्क लेता है। आइए यह भी कहें कि तर्क से उपयोगकर्ता से कुछ प्रकार का इनपुट होने की उम्मीद है। I.e तर्क केवल संकलन समय पर संकलन-समय या कॉन्फ़िगर-टाइम पर ज्ञात नहीं किया जा सकता है। क्या मुझे अपनी कक्षा को प्रोटोटाइप वसंत बीन के रूप में परिभाषित करना चाहिए या क्या मुझे इसे "नया" बनाना चाहिए।कन्स्ट्रक्टर जो तर्क लेता है - सामान्य वस्तु या वसंत बीन के रूप में परिभाषित करें?

यदि मुझे इसे एक बीन के रूप में परिभाषित करना चाहिए, तो मैं तर्कों में कैसे जा सकता हूं?

उत्तर

7

यह वसंत में समस्याग्रस्त है। यदि आपकी कक्षा में अन्य बीन्स पर कोई निर्भरता नहीं है, तो इसे new के साथ बनाएं। यदि आपके पास अन्य स्प्रिंग बीन्स के आधार पर कक्षा है लेकिन फिर भी आप कुछ रनटाइम तर्कों को पास करना चाहते हैं, तो वर्तमान में वसंत इसका समर्थन नहीं करता है।

हालांकि SPR-7431 और my article about passing custom argument to <lookup-methods/> पर एक नज़र डालें। यदि सब कुछ ठीक हो जाता है, तो यह सुविधा स्प्रिंग 3.2 का हिस्सा होनी चाहिए और इसे आपकी आवश्यकताओं से मेल खाना चाहिए। यह मूल रूप से prototype -scoped सेम बनाने की अनुमति देता है जबकि अभी भी कुछ कन्स्ट्रक्टर तर्क गुजर रहा है।

+0

बहुत अच्छी और अच्छी जानकारी। धन्यवाद –

+0

अद्यतन: यह सुविधा अभी तक वसंत का हिस्सा नहीं है। – javadeveloper

+0

क्या यह अब स्प्रिंग 4 में समर्थित है? –

5

जब तक आपकी कक्षा में आपके संदर्भ में अन्य बीन्स पर निर्भरता न हो, तब नहीं, आपको इसे एक बीन नहीं बनाना चाहिए - कोई बात नहीं है। बस new का उपयोग करें।

इसे एक बीन बनाने का एकमात्र अनिवार्य कारण यह है कि अन्य बीन्स पर निर्भर करता है, इस मामले में प्रोटोटाइप-स्कोप्ड बीन उचित है। हालांकि, यदि कक्षा को अपने कन्स्ट्रक्टर में उन रनटाइम मानों की आवश्यकता होती है, तो आप वास्तव में ऐसा नहीं कर सकते हैं, कक्षा को बदलने के बजाय कन्स्ट्रक्टर का उपयोग करने के बजाय उन्हें कुछ विधि के माध्यम से इंजेक्ट करने के लिए।

+0

खैर .. वस्तु मैं बनाने के लिए वास्तव में 'अपने तरीकों में से एक में स्प्रिंग बीन्स वापस जाने के लिए तो यह उन पर निर्भर _does_ माना जाता है चाहता हूँ। लेकिन अगर यह नहीं किया जा सकता है, तो यह नहीं किया जा सकता है ... –

+0

@ लुडविगमैग्नसन: मैं कक्षा को फिर से क्रियान्वित करने का सुझाव देता हूं, ताकि आपके रनटाइम मान विधि में पारित हो जाएं जो कि उन्हें कन्स्ट्रक्टर में पास करने के बजाय उपयुक्त बीन लौटाता है। – skaffman

+0

यह संभव नहीं है। कक्षा एक इंटरफ़ेस लागू करती है जो विधि को परिभाषित करती है और यह तर्क नहीं ले सकती है क्योंकि कार्यान्वयन कक्षाएं अलग-अलग प्रकार के इनपुट से सेम बनाने में सक्षम होती हैं। लेकिन शायद अगर मैं इसके बारे में अधिक गहराई से सोचता हूं, तो मैं इसे इस तरह से दोबारा कर सकता हूं ... –

0

पास तर्कों के वसंत-फीचर वसंत 3.2.11 में देखने-विधि does not काम का उपयोग करके कंस्ट्रक्टर के लिए, लेकिन वसंत संस्करण में काम कर रहा है 4.1.1

यहाँ कोड मैं इसे जांच के लिए इस्तेमाल कर रहे हैं:

इस इंटरफेस कारखाना है ...

package prueba; 

public interface Factory { 

    Person createPersonWithDependencies(String name); 
} 

इस सेम हम चाहते हैं, वसंत द्वारा प्रबंधित किया जा करने के लिए helloWorldService इंजेक्शन है ...

package prueba; 

public class Person { 

    private HelloWorldService helloWorldService; 

    public final void setHelloWorldService(HelloWorldService extraService) { 
     this.helloWorldService = extraService; 
    } 

    public Person() { 
     super(); 
    } 

    public Person(String name) { 
     super(); 
     this.name = name; 
    } 

    private String name; 

    public final String sayHello() { 
     return helloWorldService.getGreeting()+" I am "+name; 
    } 
} 

इस प्रसिद्ध HelloWorld सेवा है:

package prueba; 

public class HelloWorldService { 

    public String getGreeting(){ 
     return "hello world"; 
    } 
} 

यह एक उदाहरण सेवा फैक्टरी

package prueba; 

public class Service { 

    private Factory factory; 

    public final void setFactory(Factory factory) { 
     this.factory = factory; 
    } 


    public void doSomeThing(){ 
     Person bean1= factory.createPersonWithDependencies("Jhon"); 

     System.out.println(bean1.sayHello()); 

     Person bean2= factory.createPersonWithDependencies("Maria"); 

     System.out.println(bean2.sayHello()); 
     System.out.println(bean1.sayHello()); 

    } 
} 

का उपयोग करता है यह मुख्य वर्ग है कि सभी

package prueba; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

public class TestLookupMethodWithArguments { 
    /** 
    * Main method. 
    */ 
    public static void main(String[] args) { 

     ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml"); 

     Service service=applicationContext.getBean("service",Service.class); 

     service.doSomeThing(); 
    } 

} 

और अंत में परीक्षण है वसंत कॉन्फ़िगरेशन फ़ाइल:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <bean id="helloWorldService" class="prueba.HelloWorldService" /> 

    <bean id="Person" class="prueba.Person" scope="prototype"> 
     <property name="helloWorldService" ref="helloWorldService" /> 
    </bean> 

    <bean id="myFactory" class="prueba.Factory"> 
     <lookup-method name="createPersonWithDependencies" bean="Person" /> 
    </bean> 

    <bean id="service" class="prueba.Service"> 
     <property name="factory" ref="myFactory" /> 
    </bean> 
</beans> 

उत्पादन का उपयोग कर वसंत 4.1.1

hello world I am Jhon 
hello world I am Maria 
hello world I am Jhon 
संबंधित मुद्दे