2012-06-07 12 views
75

में स्थैतिक फ़ील्ड को स्वचालित क्यों नहीं कर सकते हैं क्यों हम स्प्रिंग बीन में स्थिर आवृत्ति चर को स्वचालित नहीं कर सकते हैं। मुझे पता है कि इसे हासिल करने का दूसरा तरीका है, लेकिन सिर्फ यह जानना है कि हम इसे नीचे क्यों नहीं कर सकते हैं।हम वसंत

उदा।

@Autowired 
public static Test test; 
+0

क्या आप जिस वैकल्पिक तरीके से संदर्भ दे रहे हैं उस पर कुछ प्रकाश डाल सकते हैं। – samshers

उत्तर

57

क्योंकि स्थिर फ़ील्ड का उपयोग स्थिर तरीकों के उपयोग को प्रोत्साहित करता है। और स्थिर तरीके बुराई हैं। निर्भरता इंजेक्शन का मुख्य उद्देश्य कंटेनर को आपके लिए ऑब्जेक्ट बनाने और उन्हें तार देने देना है। इसके अलावा यह परीक्षण आसान बनाता है।

एक बार जब आप स्थैतिक तरीकों का उपयोग करना शुरू कर देते हैं, तो अब आपको ऑब्जेक्ट का एक उदाहरण बनाने की आवश्यकता नहीं है और परीक्षण बहुत कठिन है। इसके अलावा आप किसी दिए गए वर्ग के कई उदाहरण नहीं बना सकते हैं, प्रत्येक एक अलग निर्भरता इंजेक्शन के साथ (क्योंकि क्षेत्र को पूरी तरह से साझा किया जाता है और वैश्विक स्थिति बनाता है - बुरा भी)।

+10

मुझे जो सामना करना पड़ा वह एक चेतावनी परीक्षण के दौरान है। यदि आप SpringJUnit4ClassRunner में '' '@ @ClClass''' का उपयोग करना चाहते हैं, और उस विधि में परीक्षण में बीन्स' '@ Autowired''' का उपयोग करें .. आप मूल रूप से नहीं कर सकते हैं। जो कष्टप्रद है। –

+4

यह उत्तर बताता है कि यह क्यों नहीं होना चाहिए "टी लेकिन वास्तविक उद्देश्य यह है कि जब ढांचा स्थिर वर्ग को बीन में तार करने का प्रयास करता है तो इसे अभी तक वर्ग लोडर द्वारा लोड नहीं किया जा सकता है। –

+31

यह उत्तर पूर्ण मूर्खतापूर्ण है। वसंत नहीं करता है ' टी परीक्षण प्रक्रिया को लागू नहीं करते हैं। उत्तर यह है कि स्प्रिंग लाइब्रेरी तब तक लोड नहीं हुई है जब स्थिर वर्ग क्लास लोडर द्वारा तत्काल किया जाता है। –

11

ओओपी अवधारणा के अनुसार, यदि स्थिर चर स्वचालित हो जाते हैं तो यह खराब डिज़ाइन होगा।

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

100

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

+33

एक ऐसे उत्तर के लिए धन्यवाद जो वास्तव में इस विचार का उत्तर देने के बजाय प्रश्न का उत्तर देता है कि जावा भाषा का आधा एक बुरा विचार है। –

7

इस समाधान से आप वसंत में स्थिर क्षेत्रों को स्वचालित कर सकते हैं।

@Component 
public class TestClass { 

    private static Test test; 

    @Autowired 
    public void setTest(Test test) { 
     TestClass.test = test; 
    } 
} 
+0

बगफाइंडर गैर स्थैतिक विधि से स्थैतिक क्षेत्र की स्थापना के बारे में शिकायत करेगा। – Neftanic