हम स्प्रिंग बीन में स्थिर उदाहरण चर को क्यों नहीं प्राप्त कर सकते हैं। मुझे पता है कि इसे प्राप्त करने का एक और तरीका है लेकिन हम जानना चाहते हैं कि हम इसे नीचे क्यों नहीं कर सकते हैं।
जैसे
@Autowired
public static Test test;
हम स्प्रिंग बीन में स्थिर उदाहरण चर को क्यों नहीं प्राप्त कर सकते हैं। मुझे पता है कि इसे प्राप्त करने का एक और तरीका है लेकिन हम जानना चाहते हैं कि हम इसे नीचे क्यों नहीं कर सकते हैं।
जैसे
@Autowired
public static Test test;
जवाबों:
क्योंकि स्थैतिक क्षेत्रों का उपयोग स्थैतिक तरीकों के उपयोग को प्रोत्साहित करता है। और स्थिर विधियां बुराई हैं। निर्भरता इंजेक्शन का मुख्य उद्देश्य कंटेनर को आपके लिए ऑब्जेक्ट बनाना और उन्हें तार देना है। इसके अलावा यह परीक्षण को आसान बनाता है।
एक बार जब आप स्थैतिक तरीकों का उपयोग करना शुरू कर देते हैं, तो आपको ऑब्जेक्ट का एक उदाहरण बनाने की आवश्यकता नहीं है और परीक्षण बहुत कठिन है। इसके अलावा, आप किसी दिए गए वर्ग के कई उदाहरण नहीं बना सकते हैं, प्रत्येक में एक अलग निर्भरता इंजेक्ट की जा रही है (क्योंकि फ़ील्ड अंतर्निहित रूप से साझा किया गया है और वैश्विक स्थिति बनाता है - यह भी बुराई है)।
@BeforeClassएक स्प्रिंगजुनिट 4 क्लैसररनर में उपयोग करना चाहते हैं , और @Autowiredपरीक्षण में उस विधि का उपयोग सेम है .. तो आप मूल रूप से नहीं कर सकते। जो कष्टप्रद है।
क्योंकि जब क्लास लोडर स्थिर मूल्यों को लोड करता है, तो स्प्रिंग संदर्भ अभी तक जरूरी लोड नहीं हुआ है। इसलिए क्लास लोडर सेम में स्थिर क्षेत्रों को ठीक से इंजेक्ट नहीं करेगा और विफल हो जाएगा।
ओओपी अवधारणा के अनुसार, यह खराब डिजाइन होगा यदि स्थिर चर को ऑटो किया गया है।
स्टेटिक वैरिएबल ऑब्जेक्ट की प्रॉपर्टी नहीं है, बल्कि यह क्लास की प्रॉपर्टी है। स्प्रिंग ऑटो वायरिंग वस्तुओं पर किया जाता है, और यह मेरी राय में डिजाइन को साफ करता है। आप एकल के रूप में ऑटो वायर्ड बीन ऑब्जेक्ट को तैनात कर सकते हैं, और इसे स्थिर को परिभाषित करने के समान ही प्राप्त कर सकते हैं।
इस समाधान से आप वसंत में स्थैतिक क्षेत्रों को स्वाहा कर सकते हैं।
@Component
public class TestClass {
private static Test test;
@Autowired
public void setTest(Test test) {
TestClass.test = test;
}
}