मैं वसंत ढांचे के लिए काफी नया हूं और निम्नलिखित मुद्दे पर आया हूं।

मेरे पास एक इंटरफ़ेस 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 में कैसे स्वचालित कर सकता हूं।

16
Chaitanya 28 जून 2011, 22:23

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" />
3
Chaitanya 22 जुलाई 2011, 03:15

किसी कारण से आपकी कक्षाएं वसंत द्वारा प्रॉक्सी की जाती हैं। ऐसा क्यों हो सकता है इसके कई कारण हैं। उदाहरण के लिए यदि आप जेपीए, या एओपी का उपयोग करते हैं तो मूल वर्ग प्रॉक्सी है।

यदि कोई वर्ग इंटरफ़ेस लागू करता है, तो प्रॉक्सी का अर्थ डायनेमिक प्रॉक्सी है। तो मूल रूप से रनटाइम में एक नया वर्ग बनाया जाता है जो इंटरफेस को लागू करता है लेकिन मूल वर्ग से प्राप्त नहीं होता है। इसलिए मूल वर्ग के लिए ऑटोवॉयरिंग काम नहीं करता है।

14
Tarlog 28 जून 2011, 22:41

यदि आपकी वस्तुओं को JDK प्रॉक्सी द्वारा प्रॉक्सी किया जाता है, तो उन्हें उनके इंटरफ़ेस द्वारा संदर्भित किया जाना चाहिए। आप अपने aop कॉन्फ़िगरेशन (applicationContext.xml में) में CGLIB (क्लासपाथ पर) और proxy-target-class="true" का उपयोग करके कंक्रीट क्लास द्वारा प्रॉक्सी बना सकते हैं।

6
Bozho 29 जून 2011, 00:03

आप @Qualifier एनोटेशन का उपयोग कर सकते हैं:

@Autowired
@Qualifier("class1")
ClassA classA1;

@Autowired
@Qualifier("class2")
ClassA classA2;

संदर्भ: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

या @Resource एनोटेशन:

@Resource(name="class1")
ClassA classA1;

@Resource(name="class2")
ClassA classA2;

संदर्भ: http ://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-resource-annotation

1
matsev 26 अगस्त 2011, 15:24

मुझे ऑटोवॉयरिंग सार सेवा के साथ समान समस्या है। आप इस तरह बिना किसी समस्या कोड के उपयोग कर सकते हैं:

@Autowired
@Qualifier("classA1")
private ClassA1 classA1;

@Autowired
@Qualifier("classA2")
private ClassA2 classA2;

यह तभी काम करेगा जब आप अपने बीन को इस तरह घोषित करेंगे

<bean id="class1" class="com.abc.ClassA1" />

या इस तरह

@Component("classA1")
public class ClassA1 {
...
}
0
Raphoq 3 जुलाई 2014, 10:58

मैंने अब तक जो कुछ देखा है, उसमें कोई प्रतिबंध नहीं लगता है, उस वर्ग के प्रकार के बारे में जिसे कोई @Autowired के रूप में चिह्नित कर सकता है।

इस मुद्दे से कोई संबंध नहीं है, लेकिन यह लेख स्थिति का ही संदर्भ देता है

0
thodorisbais 24 फरवरी 2017, 02:18