मैं वसंत ढांचे के लिए काफी नया हूं और निम्नलिखित मुद्दे पर आया हूं।
मेरे पास एक इंटरफ़ेस ClassA
है, जिसे वर्गीकृत ClassA1
और ClassA2
द्वारा कार्यान्वित किया गया है।
मेरे पास applicationContext.xml
में निम्नलिखित बीन परिभाषा जोड़ी गई है
<bean id="class1" class="com.abc.ClassA1" />
<bean id="class2" class="com.abc.ClassA2" />
मैं नीचे के रूप में दोनों कार्यान्वयन वर्गों को ऑटोवायर करना चाहता हूं।
@Autowired
private ClassA1 classA1;
@Autowired
private ClassA2 classA2;
उपरोक्त कोड त्रुटि फेंक रहा है:
फ़ील्ड में ऑटोराइट नहीं किया जा सका: com.abc.ClassA1 com.abc.SomeClass.classA1; नेस्टेड अपवाद है org.springframework.beans.factory.NoSuchBeanDefinitionException: प्रकार का कोई मिलान बीन नहीं [com.abc.ClassA1]
लेकिन, अगर मैं ऑटोवॉयरिंग को नीचे दिए गए इंटरफ़ेस में बदलता हूं:
@Autowired
ClassA classA1;
फिर ClassA1 को वेरिएबल से ऑटोवायर किया जाता है। मैं इस बात से अनजान हूं कि मैं एक चर को ClassA2 में कैसे स्वचालित कर सकता हूं।
6 जवाब
मैंने इस समस्या को ठीक करने के लिए कई तरीके आज़माए, लेकिन मैंने इसे निम्न तरीके से काम किया।
@Autowired
private ClassA classA1;
@Autowired
private ClassA classA2;
आवेदन के संदर्भ में, मैंने बीन को नीचे परिभाषित किया है:
<bean id="classA1" class="com.abc.ClassA1" autowire="byName" />
<bean id="classA2" class="com.abc.ClassA2" autowire="byName" />
किसी कारण से आपकी कक्षाएं वसंत द्वारा प्रॉक्सी की जाती हैं। ऐसा क्यों हो सकता है इसके कई कारण हैं। उदाहरण के लिए यदि आप जेपीए, या एओपी का उपयोग करते हैं तो मूल वर्ग प्रॉक्सी है।
यदि कोई वर्ग इंटरफ़ेस लागू करता है, तो प्रॉक्सी का अर्थ डायनेमिक प्रॉक्सी है। तो मूल रूप से रनटाइम में एक नया वर्ग बनाया जाता है जो इंटरफेस को लागू करता है लेकिन मूल वर्ग से प्राप्त नहीं होता है। इसलिए मूल वर्ग के लिए ऑटोवॉयरिंग काम नहीं करता है।
यदि आपकी वस्तुओं को JDK प्रॉक्सी द्वारा प्रॉक्सी किया जाता है, तो उन्हें उनके इंटरफ़ेस द्वारा संदर्भित किया जाना चाहिए। आप अपने aop कॉन्फ़िगरेशन (applicationContext.xml
में) में CGLIB (क्लासपाथ पर) और proxy-target-class="true"
का उपयोग करके कंक्रीट क्लास द्वारा प्रॉक्सी बना सकते हैं।
आप @Qualifier
एनोटेशन का उपयोग कर सकते हैं:
@Autowired
@Qualifier("class1")
ClassA classA1;
@Autowired
@Qualifier("class2")
ClassA classA2;
या @Resource
एनोटेशन:
@Resource(name="class1")
ClassA classA1;
@Resource(name="class2")
ClassA classA2;
मुझे ऑटोवॉयरिंग सार सेवा के साथ समान समस्या है। आप इस तरह बिना किसी समस्या कोड के उपयोग कर सकते हैं:
@Autowired
@Qualifier("classA1")
private ClassA1 classA1;
@Autowired
@Qualifier("classA2")
private ClassA2 classA2;
यह तभी काम करेगा जब आप अपने बीन को इस तरह घोषित करेंगे
<bean id="class1" class="com.abc.ClassA1" />
या इस तरह
@Component("classA1")
public class ClassA1 {
...
}
मैंने अब तक जो कुछ देखा है, उसमें कोई प्रतिबंध नहीं लगता है, उस वर्ग के प्रकार के बारे में जिसे कोई @Autowired के रूप में चिह्नित कर सकता है।
इस मुद्दे से कोई संबंध नहीं है, लेकिन यह लेख स्थिति का ही संदर्भ देता है
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।