2009-07-28 12 views
8

मैं एक विरासत कोड बेस से निपट रहा हूं जहां वसंत में वायर्ड नहीं होने वाली कक्षा को वसंत में वायर्ड किया जाता है। मैं एक फैक्ट्री क्लास बनाने की उम्मीद कर रहा था जिसे स्टार्टअप पर रखा गया था और फिर मैं वायर्ड अप ऑब्जेक्ट प्राप्त करने के लिए getInstance() विधि को कॉल कर सकता था। इस के बारे में जाने के लिए सबसे अच्छा तरीका क्या है?स्प्रिंग वायर एक स्टेटिक क्लास

उदाहरण:

public class LegacyA { 
    public void doSomething() { 
     ... 
     Foo foo = FooFactory.getInstance(); 
     ... 
    } 
} 

public class FooFactory { 
    private static Foo foo; 

    public static Foo getInstance() { 
     if (foo == null) throw new IllegalStateException(); 
     return foo; 
    } 
} 

मैं FooFactory जरूरत स्टार्टअप पर तार हो, ताकि LegacyA बस getInstance() कॉल कर सकते हैं इतना है कि यह (फू का एक उदाहरण है जो भी एक सेम आवेदन के संदर्भ में परिभाषित किया गया है देता है)।

<bean id="legacyA" class="LegacyA"/> 

<bean id="foo" class="Foo"/> 

<!-- I need this bean to be injected with foo so that the FooFactory can return a foo --> 
<bean id="fooFactory" class="FooFactory"/> 

संपादित करें: मैं अपने उदाहरण एक सा फिर से काम करना पड़ता था के रूप में मुझे मिल गया यह थोड़ा अपने ही सिर में confuzzled ...

+0

फू फैक्ट्री में फू इंजेक्शन कैसे किया जाता है? एक सेटर, कन्स्ट्रक्टर, ...? – wds

उत्तर

10

इस तरह स्टैटिक्स का उपयोग वास्तव में वसंत आईओसी के अनाज के खिलाफ जाता है, लेकिन अगर आप वास्तव में उन्हें इस्तेमाल करने है, तो मैं एक साधारण वसंत हुक जो Foo जैसे लगते हैं और FooFactory में यह इंजेक्शन, लेखन सुझाव है

public class FooFactoryProcessor implements InitializingBean { 

    private Foo foo; 

    public void setFoo(Foo foo) { 
     this.foo = foo; 
    } 

    public void afterPropertiesSet() throws Exception { 
     Foofactory.setFoo(foo); 
    } 
} 

और अपने एक्सएमएल में:

<bean id="foo" class="Foo"/> 

<bean class="FooFactoryProcessor"> 
    <property name="foo" ref="foo"/> 
</bean> 

Foo या FooFactory

+0

आपकी स्थिर टिप्पणी के संबंध में सहमत हुए। मैं आमतौर पर उस मार्ग को कभी नहीं छोड़ूंगा हालांकि विरासत कोड इस जगह पर इस स्थैतिक वर्ग का उपयोग करता है और मौजूदा कोड को तोड़ने के बिना इस नए वसंत वस्तु में हुक करने का सबसे अच्छा तरीका है पुराने कॉल को कॉल को पुराने स्थैतिक वर्ग में रखना और उस स्थिर कक्षा नए और बेहतर वसंत वायर्ड वस्तु का उपयोग करें। – digiarnie

+2

आप वसंत को सीधे FooFactory का प्रबंधन क्यों नहीं करते हैं। आपको वास्तव में "FooFactoryProcessor" के अमूर्तता की आवश्यकता नहीं है। आप fooFactory पर foo सेट करने के लिए एक गैर स्थैतिक संपत्ति सेटर जोड़ सकते हैं। –

+0

यह सच है, हां, लेकिन मैं विरासत कोड में सबसे छोटी संख्या में बदलावों के साथ जा रहा था, जो ओपी के बाद हुआ था। – skaffman

1

उपयोग की स्प्रिंग विन्यास में एक singleton के रूप में सेम को परिभाषित है यहाँ ? इसके बाद आप इसे संपत्ति या कन्स्ट्रक्टर इंजेक्ट का उपयोग करके LegacyB में इंजेक्ट कर सकते हैं (मेरी वरीयता उत्तरार्द्ध है) और फिर केवल एक उदाहरण उपलब्ध है।

संपादित करें: पुन:। आपका बदला प्रश्न (!) मुझे यकीन नहीं है कि आप अपने कारखाने में एक सिंगलटन के रूप में फिर से फू इंजेक्ट क्यों नहीं करते हैं। ध्यान दें कि आप factory-method का उपयोग कर स्प्रिंग कॉन्फ़िगरेशन के माध्यम से getInstance() विधि का उपयोग कर सकते हैं, और सभी वर्गों के माध्यम से इंजेक्शन बनाए रख सकते हैं।

+0

आप पर सवाल थोड़ा सा बदलने के लिए खेद है। मुझे तब तक एहसास नहीं हुआ जब तक मेरे सिर में पूरा सवाल गलत नहीं था। – digiarnie

+0

सिर के लिए धन्यवाद। वह कोई समस्या नहीं है। जवाब उचित रूप से संशोधित किया गया। –

1

संशोधित करने के लिए इसके अलावा skaffman करने के जवाब देने के तुम बहुत बहुत आरंभीकरण आदेश के बारे में सावधान रहना चाहिए कोई ज़रूरत नहीं।

वसंत बीन्स का उपयोग करते समय केवल ढांचा स्वचालित रूप से सामान शुरू करने के सही क्रम को समझ लेगा। जैसे ही आप सिंगलटन चाल कर रहे हैं, अगर आप सावधान नहीं हैं तो यह तोड़ सकता है।

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

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