पृष्ठभूमि:
मेरे पास स्प्रिंग 2.5 / Java / Tomcat एप्लिकेशन है। निम्नलिखित बीन है, जिसका उपयोग कई स्थानों पर पूरे अनुप्रयोग में किया जाता है
public class HibernateDeviceDao implements DeviceDao
और निम्नलिखित बीन जो नई है:
public class JdbcDeviceDao implements DeviceDao
पहला बीन कॉन्फ़िगर किया गया है (पैकेज में सभी सेम शामिल हैं)
<context:component-scan base-package="com.initech.service.dao.hibernate" />
दूसरा (नया) बीन अलग से कॉन्फ़िगर किया गया है
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">
<property name="dataSource" ref="jdbcDataSource">
</bean>
सर्वर शुरू करते समय यह (निश्चित रूप से) एक अपवाद होता है:
नेस्टेड अपवाद है org.springframework.beans.factory.NoSuchBeanDefinitionException: कोई अद्वितीय बीन प्रकार का नहीं [com.sevenp.mobile.samplemgmt.service.dk.DeviceDao] परिभाषित किया गया है: अपेक्षित एकल मिलान बीन लेकिन पाया 2: [deviceDao, jdbevice
एक वर्ग से सेम को इस तरह से दबाने की कोशिश कर रहा है
@Autowired
private DeviceDao hibernateDevicDao;
क्योंकि एक ही इंटरफ़ेस को लागू करने में दो सेम हैं।
प्रश्न:
क्या फलियों को कॉन्फ़िगर करना संभव है ताकि
1. मुझे मौजूदा कक्षाओं में परिवर्तन करने की आवश्यकता नहीं है, जो पहले से ही HibernateDeviceDao
स्वत: प्राप्त है
2. अभी भी इस तरह से दूसरी (नई) बीन का उपयोग करने में सक्षम है:
@Autowired
@Qualifier("jdbcDeviceDao")
यानी मुझे HibernateDeviceDao
बीन को कॉन्फ़िगर करने के लिए डिफ़ॉल्ट बीन के रूप में कॉन्फ़िगर करने का एक तरीका चाहिए, JdbcDeviceDao
साथ ही @Qualifier
एनोटेशन के साथ स्पष्ट रूप से निर्दिष्ट करते समय ए के उपयोग की अनुमति देता है ।
मैंने पहले ही कोशिश की है:
मैंने संपत्ति स्थापित करने की कोशिश की
autowire-candidate="false"
JdbcDeviceDao के लिए सेम विन्यास में:
<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">
<property name="dataSource" ref="jdbcDataSource"/>
</bean>
क्योंकि स्प्रिंग प्रलेखन का कहना है कि
यह इंगित करता है कि इस बीन पर विचार किया जाना चाहिए या नहीं, जब किसी अन्य सेम की ऑटोवायरिंग आवश्यकताओं को पूरा करने के लिए मिलान वाले उम्मीदवारों की तलाश की जाए। ध्यान दें कि यह नाम से स्पष्ट संदर्भों को प्रभावित नहीं करता है, जो निर्दिष्ट बीन को एक ऑटोवेयर उम्मीदवार के रूप में चिह्नित नहीं होने पर भी हल हो जाएगा। *
जिसका अर्थ है कि मैं एनोटेशन JdbcDeviceDao
का उपयोग करके अभी भी ऑटोवेयर कर सकता हूं @Qualifier
और HibernateDeviceDao
डिफ़ॉल्ट बीन है। जाहिरा तौर पर मेरी व्याख्या सही नहीं थी, हालांकि, सर्वर शुरू करते समय निम्न त्रुटि संदेश में यह परिणाम है:
टाइप की असंतुष्ट निर्भरता [वर्ग com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]: कम से कम 1 मिलान करने की उम्मीद सेम
जिस वर्ग से मैंने क्वालीफ़ायर के साथ बीन को स्वत: प्राप्त करने की कोशिश की है:
@Autowired
@Qualifier("jdbcDeviceDao")
उपाय:
@Resource एनोटेशन का प्रयास करने के लिए स्कैफ़मैन का सुझाव । इसलिए कॉन्फ़िगरेशन में ऑटोवेयर-उम्मीदवार को jdbcDeviceDao के लिए गलत सेट किया गया है और jdbcDeviceDao का उपयोग करते समय मैं इसे @Resource एनोटेशन (@Qualifier के बजाय) का उपयोग करके संदर्भित करता हूं:
@Resource(name = "jdbcDeviceDao")
private JdbcDeviceListItemDao jdbcDeviceDao;