2013-10-27 6 views
8

यह प्रश्न थोड़ा अजीब लग सकता है। मान लीजिए मेरे पास एक ऐसी सेवा है जिसे मैं उपयोगिता वर्ग में उपयोग करना चाहता हूं जिसमें कुछ स्थैतिक विधियां हैं। सेवा एक वसंत बीन है, इसलिए स्वाभाविक रूप से मैं उदाहरण के लिए एक सेटटर और (@Autowired) का उपयोग अपनी उपयोगिता वर्ग में इंजेक्ट करने के लिए करूंगा। जैसा कि वसंत के दस्तावेज़ीकरण में इसका उल्लेख है, सभी बीन्स बीन संदर्भ में स्थिर हैं। तो जब आप कक्षा में एक बीन इंजेक्ट करना चाहते हैं तो आपको "स्थैतिक" संशोधक का उपयोग करने की आवश्यकता नहीं है। नीचे देखें:स्थिर विधि में इंजेक्शन बीन का उपयोग करने का सही तरीका क्या है?

 

public class JustAClass{ 
    private Service service; 

    public void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

अब मैं क्या पहले उल्लेख के लिए वापस जा (एक स्थिर विधि में सेवा का उपयोग करके):

 

public class JustAClass{ 
    private static Service service; 

    public static void aMethod(){ 
    service.doSomething(....); 
    } 

    @Autowired 
    public void setService(Service service){ 
    this.service = service; 
    } 

} 
 

हालांकि सेवा स्थिर है, मैं इसकी परिभाषा के पीछे स्थिर डाल करने के लिए मजबूर कर रहा हूँ। यह मेरे लिए थोड़ा सा अंतर्ज्ञानी है। क्या यह गलत है? या यह एक बेहतर तरीका है? धन्यवाद

उत्तर

12

आप स्थैतिक क्षेत्र को स्वत: नहीं कर सकते हैं।

लेकिन आप एक छोटे से वैकल्पिक हल कर सकते हैं:

@Component 
public class JustAClass{ 
    private static Service service; 

    @Autowired 
    private Service tmpService; 

    @PostConstruct 
    public void init() { 
    service = tmpService; 
    } 

} 

ध्यान दें, कि आपके पास tmpService

+0

सुई यह अच्छा है मेरे लिए काम करता है के रूप में "घटक" इस वर्ग घोषित करने के लिए! – Kaunteya

+0

क्या यह ऐसा कुछ है जो नियमित रूप से किया जाएगा? या क्या इन परिस्थितियों में आम तौर पर एक अलग दृष्टिकोण होता है? –

3

आपके पास कोई विकल्प नहीं है। यदि आप कक्षा के static फ़ील्ड को प्रारंभ करना चाहते हैं, तो आपको स्प्रिंग को उस वर्ग का उदाहरण बनाने और मूल्य को इंजेक्ट करने देना होगा।

एक छोटी सी सलाह। इस मामले में static विधियों का उपयोग करने के लिए वास्तव में कोई कारण नहीं है। यदि आप सिंगलटन उपयोगिता चाहते हैं, तो बस अपने बीन को singleton स्कोप बनाएं।

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