2011-08-31 14 views
29

वसंत में संभव है कि बीन के लिए कक्षा में सार्वजनिक कन्स्ट्रक्टर नहीं है लेकिन केवल निजी है? बीन बनने पर यह निजी कन्स्ट्रक्टर लागू होगा? धन्यवाद।निजी कन्स्ट्रक्टर के साथ जावा स्प्रिंग बीन

+6

इसे कैसे आज़माएं और फिर परिणाम पोस्ट करने के बारे में? – dm3

+0

यह मुश्किल है - मेरे पास सभी स्रोत नहीं हैं। – user710818

उत्तर

52

हां, वसंत निजी रचनाकारों का आह्वान कर सकता है। यदि दृश्यता के बावजूद, सही तर्क के साथ एक कन्स्ट्रक्टर पाता है, तो यह इसके कन्स्ट्रक्टर को सुलभ बनाने के लिए प्रतिबिंब का उपयोग करेगा।

+0

क्या आप मुझे दस्तावेज़ों का संदर्भ दे सकते हैं? कन्स्ट्रक्टर में पैरामीटर होते हैं, और xml फ़ाइल में इस तर्क के लिए मान निर्दिष्ट किए जाते हैं। – user710818

+0

आपका मतलब है कि यदि एक बीन विशेष रूप से निजी बीन() {...} वसंत की तरह कुछ आह्वान कर सकता है? यह कैसे संभव है, जो "निजी" के पूरे उद्देश्य को निंदा करता है। –

+0

क्षमा करें, मैं शायद इसके बारे में गलत हूं केवल नो-एर्ग कन्स्ट्रक्टर नहीं। मैं बस अपनी परियोजनाओं पर जो देखा है उससे जा रहा हूं। मैं नहीं कह सकता कि मैंने कभी इसे स्प्रिंग प्रलेखन में कहीं भी देखा है। लेकिन यह वर्ग के लिए जावाडोक है जो तत्काल करने के लिए ज़िम्मेदार है।http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/beans/BeanUtils.html#instantiateClass(java.lang.reflect.Constructor,%20java.lang.Object .. ।) –

-2

आपके पास आमतौर पर इस तरह के सेम में एक स्थिर फैक्ट्री विधि होगी, आप उस बीन का उदाहरण प्राप्त करने के लिए वसंत के लिए उस विधि को निर्दिष्ट कर सकते हैं। 3.3.1.3 here. देखें दृश्यता प्रतिबंधों के मुकाबले स्प्रिंग द्वारा इसकी अनुशंसा की जाती है।

+0

अजीब, कोई स्थैतिक विधि नहीं है, कोई सार्वजनिक कन्स्ट्रक्टर नहीं है, लेकिन जब मैं डीबग करता हूं - निजी कन्स्ट्रक्टर ने आह्वान किया! sun.reflect.NativeConstructorAccessorImpl – user710818

+0

विनिर्देशों/कोड के बिना आगे टिप्पणी करना संभव नहीं होगा! –

+0

मुझे लगता है कि आप गलत हैं। कोई विशिष्ट कोड नहीं है - मैं केवल मानक सूरज/वसंत विधियों को डीबगर में देखता हूं। – user710818

3

तुम हमेशा The IoC container: Instantiation using an instance factory method से नहीं बल्कि एक डिफ़ॉल्ट निर्माता पर भरोसा करने की बजाय सेम बनाने के लिए, एक कारखाने विधि का उपयोग कर सकते हैं:

<!-- the factory bean, which contains a method called createInstance() --> 
<bean id="serviceLocator" class="com.foo.DefaultServiceLocator"> 
    <!-- inject any dependencies required by this locator bean --> 
</bean> 

<!-- the bean to be created via the factory bean --> 
<bean id="exampleBean" 
     factory-bean="serviceLocator" 
     factory-method="createInstance"/> 

यह लाभ है कि आप अपने सेम लिए गैर-सामान्य कंस्ट्रक्टर्स का उपयोग कर सकते है, और फैक्ट्री विधि बीन के लिए निर्भरता भी इंजेक्शन दी जा सकती है।

+0

दिलचस्प है, लेकिन मुझे कारखाना नहीं मिल रहा है। एक और तरीका मौजूद हो सकता है? – user710818

+0

@ मैथ्यू: वह कुछ भयानक तीसरे पक्ष के कोड के आसपास वसंत को दोबारा शुरू कर रहा है। यह गन्दा होने के लिए सिर्फ _bound_ है। –

+1

@ डोनाल, नहीं, मुझे नहीं पता था कि उन्होंने टिप्पणी में क्या कहा था। –

2

हां, निजी रचनाकार वसंत द्वारा बुलाए जाते हैं। मेरे कोड पर विचार करें:

बीन परिभाषा फ़ाइल:

<bean id="message" class="com.aa.testp.Message"> 
     <constructor-arg index="0" value="Hi Nice"/> 
    </bean> 

बीन वर्ग:

package com.aa.testp; 

public class Message { 

    private String message; 

    private Message(String msg) { 
     // You may add your log or print statements to check execution or invocation 
     message = msg; 
    } 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

    public void display() { 
     System.out.println(" Hi " + message); 
    } 

} 

उपरोक्त कोड ठीक काम करता है। इसलिए, वसंत ने निजी कन्स्ट्रक्टर का आह्वान किया।

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